Merge m-c to inbound, a=merge
authorWes Kocher <wkocher@mozilla.com>
Tue, 17 Jan 2017 17:59:26 -0800
changeset 374755 1214fccec674373d756441d7cc9375e636586306
parent 374754 304ab4d298b7ba7d5bdfa8f884882cc23685bb84 (current diff)
parent 374689 80eac484366ad881c6a10bf81e8d9b8f7a676c75 (diff)
child 374756 00c84bfb500599f5a427a51f52145d0cde8cb204
push id6996
push userjlorenzo@mozilla.com
push dateMon, 06 Mar 2017 20:48:21 +0000
treeherdermozilla-beta@d89512dab048 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone53.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
Merge m-c to inbound, a=merge MozReview-Commit-ID: 10MpA6zwIWr
browser/base/content/browser.js
browser/base/content/tab-content.js
browser/base/content/test/general/browser.ini
taskcluster/ci/build/linux.yml
toolkit/content/browser-child.js
--- a/browser/base/content/aboutRobots.xhtml
+++ b/browser/base/content/aboutRobots.xhtml
@@ -24,17 +24,17 @@
   <head>
     <title>&robots.pagetitle;</title>
     <link rel="stylesheet" href="chrome://global/skin/netError.css" type="text/css" media="all" />
     <link rel="icon" type="image/png" id="favicon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAACGFjVEwAAAASAAAAAJNtBPIAAAAaZmNUTAAAAAAAAAAQAAAAEAAAAAAAAAAALuAD6AABhIDeugAAALhJREFUOI2Nk8sNxCAMRDlGohauXFOMpfTiAlxICqAELltHLqlgctg1InzMRhpFAc%2BLGWTnmoeZYamt78zXdZmaQtQMADlnU0OIAlbmJUBEcO4bRKQY2rUXIPmAGnDuG%2FBx3%2FfvOPVaDUg%2BoAPUf1PArIMCSD5glMEsUGaG%2BkyAFWIBaCsKuA%2BHGCNijLgP133XgOEtaPFMy2vUolEGJoCIzBmoRUR9%2B7rxj16DZaW%2FmgtmxnJ8V3oAnApQwNS5zpcAAAAaZmNUTAAAAAEAAAAQAAAAEAAAAAAAAAAAAB4D6AIB52fclgAAACpmZEFUAAAAAjiNY2AYBVhBc3Pzf2LEcGreqcbwH1kDNjHauWAUjAJyAADymxf9WF%2Bu8QAAABpmY1RMAAAAAwAAABAAAAAQAAAAAAAAAAAAHgPoAgEK8Q9%2FAAAAFmZkQVQAAAAEOI1jYBgFo2AUjAIIAAAEEAAB0xIn4wAAABpmY1RMAAAABQAAABAAAAAQAAAAAAAAAAAAHgPoAgHnO30FAAAAQGZkQVQAAAAGOI1jYBieYKcaw39ixHCC%2F6cwFWMTw2rz%2F1MM%2F6Vu%2Ff%2F%2F%2FxTD%2F51qEIwuRjsXILuEGLFRMApgAADhNCsVfozYcAAAABpmY1RMAAAABwAAABAAAAAQAAAAAAAAAAAAHgPoAgEKra7sAAAAFmZkQVQAAAAIOI1jYBgFo2AUjAIIAAAEEAABM9s3hAAAABpmY1RMAAAACQAAABAAAAAQAAAAAAAAAAAAHgPoAgHn3p%2BwAAAAKmZkQVQAAAAKOI1jYBgFWEFzc%2FN%2FYsRwat6pxvAfWQM2Mdq5YBSMAnIAAPKbF%2F1BhPl6AAAAGmZjVEwAAAALAAAAEAAAABAAAAAAAAAAAAAeA%2BgCAQpITFkAAAAWZmRBVAAAAAw4jWNgGAWjYBSMAggAAAQQAAHaszpmAAAAGmZjVEwAAAANAAAAEAAAABAAAAAAAAAAAAAeA%2BgCAeeCPiMAAABAZmRBVAAAAA44jWNgGJ5gpxrDf2LEcIL%2FpzAVYxPDavP%2FUwz%2FpW79%2F%2F%2F%2FFMP%2FnWoQjC5GOxcgu4QYsVEwCmAAAOE0KxUmBL0KAAAAGmZjVEwAAAAPAAAAEAAAABAAAAAAAAAAAAAeA%2BgCAQoU7coAAAAWZmRBVAAAABA4jWNgGAWjYBSMAggAAAQQAAEpOBELAAAAGmZjVEwAAAARAAAAEAAAABAAAAAAAAAAAAAeA%2BgCAeYVWtoAAAAqZmRBVAAAABI4jWNgGAVYQXNz839ixHBq3qnG8B9ZAzYx2rlgFIwCcgAA8psX%2FWvpAecAAAAaZmNUTAAAABMAAAAQAAAAEAAAAAAAAAAAAB4D6AIBC4OJMwAAABZmZEFUAAAAFDiNY2AYBaNgFIwCCAAABBAAAcBQHOkAAAAaZmNUTAAAABUAAAAQAAAAEAAAAAAAAAAAAB4D6AIB5kn7SQAAAEBmZEFUAAAAFjiNY2AYnmCnGsN%2FYsRwgv%2BnMBVjE8Nq8%2F9TDP%2Blbv3%2F%2F%2F8Uw%2F%2BdahCMLkY7FyC7hBixUTAKYAAA4TQrFc%2BcEoQAAAAaZmNUTAAAABcAAAAQAAAAEAAAAAAAAAAAAB4D6AIBC98ooAAAABZmZEFUAAAAGDiNY2AYBaNgFIwCCAAABBAAASCZDI4AAAAaZmNUTAAAABkAAAAQAAAAEAAAAAAAAAAAAB4D6AIB5qwZ%2FAAAACpmZEFUAAAAGjiNY2AYBVhBc3Pzf2LEcGreqcbwH1kDNjHauWAUjAJyAADymxf9cjJWbAAAABpmY1RMAAAAGwAAABAAAAAQAAAAAAAAAAAAHgPoAgELOsoVAAAAFmZkQVQAAAAcOI1jYBgFo2AUjAIIAAAEEAAByfEBbAAAABpmY1RMAAAAHQAAABAAAAAQAAAAAAAAAAAAHgPoAgHm8LhvAAAAQGZkQVQAAAAeOI1jYBieYKcaw39ixHCC%2F6cwFWMTw2rz%2F1MM%2F6Vu%2Ff%2F%2F%2FxTD%2F51qEIwuRjsXILuEGLFRMApgAADhNCsVlxR3%2FgAAABpmY1RMAAAAHwAAABAAAAAQAAAAAAAAAAAAHgPoAgELZmuGAAAAFmZkQVQAAAAgOI1jYBgFo2AUjAIIAAAEEAABHP5cFQAAABpmY1RMAAAAIQAAABAAAAAQAAAAAAAAAAAAHgPoAgHlgtAOAAAAKmZkQVQAAAAiOI1jYBgFWEFzc%2FN%2FYsRwat6pxvAfWQM2Mdq5YBSMAnIAAPKbF%2F0%2FMvDdAAAAAElFTkSuQmCC"/>
 
     <script type="application/javascript"><![CDATA[
       var buttonClicked = false;
       function robotButton() {
-        var button = document.getElementById('errorTryAgain');
+        var button = document.getElementById("errorTryAgain");
         if (buttonClicked) {
           button.style.visibility = "hidden";
         } else {
           var newLabel = button.getAttribute("label2");
           button.textContent = newLabel;
           buttonClicked = true;
         }
       }
--- a/browser/base/content/aboutaccounts/aboutaccounts.js
+++ b/browser/base/content/aboutaccounts/aboutaccounts.js
@@ -265,17 +265,17 @@ var wrapper = {
 
     fxAccounts.signOut().then(
       () => this.injectData("message", { status: "sign_out" }),
       (err) => this.injectData("message", { status: "error", error: err })
     );
   },
 
   handleRemoteCommand(evt) {
-    log('command: ' + evt.detail.command);
+    log("command: " + evt.detail.command);
     let data = evt.detail.data;
 
     switch (evt.detail.command) {
       case "login":
         this.onLogin(data);
         break;
       case "can_link_account":
         this.onCanLinkAccount(data);
@@ -415,29 +415,29 @@ function setErrorPage(errorType) {
 // Causes the "top-level" element with |id| to be shown - all other top-level
 // elements are hidden.  Optionally, ensures that only 1 "second-level" element
 // inside the top-level one is shown.
 function show(id, childId) {
   // top-level items are either <div> or <iframe>
   let allTop = document.querySelectorAll("body > div, iframe");
   for (let elt of allTop) {
     if (elt.getAttribute("id") == id) {
-      elt.style.display = 'block';
+      elt.style.display = "block";
     } else {
-      elt.style.display = 'none';
+      elt.style.display = "none";
     }
   }
   if (childId) {
     // child items are all <div>
     let allSecond = document.querySelectorAll("#" + id + " > div");
     for (let elt of allSecond) {
       if (elt.getAttribute("id") == childId) {
-        elt.style.display = 'block';
+        elt.style.display = "block";
       } else {
-        elt.style.display = 'none';
+        elt.style.display = "none";
       }
     }
   }
 }
 
 // Migrate sync data from the default profile to the dev-edition profile.
 // Returns a promise of a true value if migration succeeded, or false if it
 // failed.
@@ -495,27 +495,27 @@ function getDefaultProfilePath() {
                         .getService(Ci.nsIToolkitProfileService)
                         .defaultProfile;
   return defaultProfile.rootDir.path;
 }
 
 document.addEventListener("DOMContentLoaded", function onload() {
   document.removeEventListener("DOMContentLoaded", onload, true);
   init();
-  var buttonGetStarted = document.getElementById('buttonGetStarted');
-  buttonGetStarted.addEventListener('click', getStarted);
+  var buttonGetStarted = document.getElementById("buttonGetStarted");
+  buttonGetStarted.addEventListener("click", getStarted);
 
-  var buttonRetry = document.getElementById('buttonRetry');
-  buttonRetry.addEventListener('click', retry);
+  var buttonRetry = document.getElementById("buttonRetry");
+  buttonRetry.addEventListener("click", retry);
 
-  var oldsync = document.getElementById('oldsync');
-  oldsync.addEventListener('click', handleOldSync);
+  var oldsync = document.getElementById("oldsync");
+  oldsync.addEventListener("click", handleOldSync);
 
-  var buttonOpenPrefs = document.getElementById('buttonOpenPrefs')
-  buttonOpenPrefs.addEventListener('click', openPrefs);
+  var buttonOpenPrefs = document.getElementById("buttonOpenPrefs")
+  buttonOpenPrefs.addEventListener("click", openPrefs);
 }, true);
 
 function initObservers() {
   function observe(subject, topic, data) {
     log("about:accounts observed " + topic);
     if (topic == fxAccountsCommon.ONLOGOUT_NOTIFICATION) {
       // All about:account windows get changed to action=signin on logout.
       window.location = "about:accounts?action=signin";
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -1692,17 +1692,17 @@ var BookmarkingUI = {
       let widthDiff = referenceRect.width - rectToPosition.width;
       return [(leftDiff + .5 * widthDiff) + "px", (topDiff + .5 * heightDiff) + "px"];
     }
 
     if (this._notificationTimeout) {
       clearTimeout(this._notificationTimeout);
     }
 
-    if (this.notifier.style.transform == '') {
+    if (this.notifier.style.transform == "") {
       // Get all the relevant nodes and computed style objects
       let dropmarker = document.getAnonymousElementByAttribute(this.button, "anonid", "dropmarker");
       let dropmarkerIcon = document.getAnonymousElementByAttribute(dropmarker, "class", "dropmarker-icon");
       let dropmarkerStyle = getComputedStyle(dropmarkerIcon);
 
       // Check for RTL and get bounds
       let isRTL = getComputedStyle(this.button).direction == "rtl";
       let buttonRect = this.button.getBoundingClientRect();
@@ -1737,18 +1737,18 @@ var BookmarkingUI = {
       this.dropmarkerNotifier.setAttribute("notification", "finish");
     }
 
     this._notificationTimeout = setTimeout( () => {
       this.notifier.removeAttribute("notification");
       this.dropmarkerNotifier.removeAttribute("notification");
       this.button.removeAttribute("notification");
 
-      this.dropmarkerNotifier.style.transform = '';
-      this.notifier.style.transform = '';
+      this.dropmarkerNotifier.style.transform = "";
+      this.notifier.style.transform = "";
     }, 1000);
   },
 
   _showSubview() {
     let view = document.getElementById("PanelUI-bookmarks");
     view.addEventListener("ViewShowing", this);
     view.addEventListener("ViewHiding", this);
     let anchor = document.getElementById(this.BOOKMARK_BUTTON_ID);
--- a/browser/base/content/browser-plugins.js
+++ b/browser/base/content/browser-plugins.js
@@ -413,17 +413,17 @@ var gPluginHandler = {
             }
           }
         }
       ];
       n = notificationBox.
         appendNotification(message, "plugin-hidden", null,
                            notificationBox.PRIORITY_INFO_HIGH, buttons);
       if (haveInsecure) {
-        n.classList.add('pluginVulnerable');
+        n.classList.add("pluginVulnerable");
       }
     }
 
     if (actions.length == 0) {
       hideNotification();
     } else {
       let notificationPermission = Services.perms.testPermissionFromPrincipal(
         principal, "plugin-hidden-notification");
--- a/browser/base/content/browser-syncui.js
+++ b/browser/base/content/browser-syncui.js
@@ -427,19 +427,19 @@ var gSyncUI = {
     let sixDaysAgo = (() => {
       let tempDate = new Date();
       tempDate.setDate(tempDate.getDate() - 6);
       tempDate.setHours(0, 0, 0, 0);
       return tempDate;
     })();
     // It may be confusing for the user to see "Last Sync: Monday" when the last sync was a indeed a Monday but 3 weeks ago
     if (date < sixDaysAgo) {
-      dateFormat = {month: 'long', day: 'numeric'};
+      dateFormat = {month: "long", day: "numeric"};
     } else {
-      dateFormat = {weekday: 'long', hour: 'numeric', minute: 'numeric'};
+      dateFormat = {weekday: "long", hour: "numeric", minute: "numeric"};
     }
     let lastSyncDateString = date.toLocaleDateString(undefined, dateFormat);
     return this._stringBundle.formatStringFromName("lastSync2.label", [lastSyncDateString], 1);
   },
 
   onClientsSynced() {
     let broadcaster = document.getElementById("sync-syncnow-state");
     if (broadcaster) {
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -113,17 +113,17 @@ if (AppConstants.MOZ_CRASHREPORTER) {
 
 XPCOMUtils.defineLazyGetter(this, "BrowserToolboxProcess", function() {
   let tmp = {};
   Cu.import("resource://devtools/client/framework/ToolboxProcess.jsm", tmp);
   return tmp.BrowserToolboxProcess;
 });
 
 XPCOMUtils.defineLazyGetter(this, "gBrowserBundle", function() {
-  return Services.strings.createBundle('chrome://browser/locale/browser.properties');
+  return Services.strings.createBundle("chrome://browser/locale/browser.properties");
 });
 
 XPCOMUtils.defineLazyGetter(this, "gCustomizeMode", function() {
   let scope = {};
   Cu.import("resource:///modules/CustomizeMode.jsm", scope);
   return new scope.CustomizeMode(window);
 });
 
@@ -748,17 +748,17 @@ function gKeywordURIFixup({ target: brow
   // Additionally, we need the host of the parsed url
   let hostName = alternativeURI.host;
   // and the ascii-only host for the pref:
   let asciiHost = alternativeURI.asciiHost;
   // Normalize out a single trailing dot - NB: not using endsWith/lastIndexOf
   // because we need to be sure this last dot is the *only* dot, too.
   // More generally, this is used for the pref and should stay in sync with
   // the code in nsDefaultURIFixup::KeywordURIFixup .
-  if (asciiHost.indexOf('.') == asciiHost.length - 1) {
+  if (asciiHost.indexOf(".") == asciiHost.length - 1) {
     asciiHost = asciiHost.slice(0, -1);
   }
 
   let isIPv4Address = host => {
     let parts = host.split(".");
     if (parts.length != 4) {
       return false;
     }
@@ -844,17 +844,17 @@ function gKeywordURIFixup({ target: brow
 // A shared function used by both remote and non-remote browser XBL bindings to
 // load a URI or redirect it to the correct process.
 function _loadURIWithFlags(browser, uri, params) {
   if (!uri) {
     uri = "about:blank";
   }
   let flags = params.flags || 0;
   let referrer = params.referrerURI;
-  let referrerPolicy = ('referrerPolicy' in params ? params.referrerPolicy :
+  let referrerPolicy = ("referrerPolicy" in params ? params.referrerPolicy :
                         Ci.nsIHttpChannel.REFERRER_POLICY_UNSET);
   let postData = params.postData;
 
   let currentRemoteType = browser.remoteType;
   let requiredRemoteType =
     E10SUtils.getRemoteTypeForURI(uri, gMultiProcessBrowser, currentRemoteType);
   let mustChangeProcess = requiredRemoteType != currentRemoteType;
 
@@ -1593,34 +1593,34 @@ var gBrowserInit = {
 };
 
 if (AppConstants.platform == "macosx") {
   // nonBrowserWindowStartup(), nonBrowserWindowDelayedStartup(), and
   // nonBrowserWindowShutdown() are used for non-browser windows in
   // macBrowserOverlay
   gBrowserInit.nonBrowserWindowStartup = function() {
     // Disable inappropriate commands / submenus
-    var disabledItems = ['Browser:SavePage',
-                         'Browser:SendLink', 'cmd_pageSetup', 'cmd_print', 'cmd_find', 'cmd_findAgain',
-                         'viewToolbarsMenu', 'viewSidebarMenuMenu', 'Browser:Reload',
-                         'viewFullZoomMenu', 'pageStyleMenu', 'charsetMenu', 'View:PageSource', 'View:FullScreen',
-                         'viewHistorySidebar', 'Browser:AddBookmarkAs', 'Browser:BookmarkAllTabs',
-                         'View:PageInfo'];
+    var disabledItems = ["Browser:SavePage",
+                         "Browser:SendLink", "cmd_pageSetup", "cmd_print", "cmd_find", "cmd_findAgain",
+                         "viewToolbarsMenu", "viewSidebarMenuMenu", "Browser:Reload",
+                         "viewFullZoomMenu", "pageStyleMenu", "charsetMenu", "View:PageSource", "View:FullScreen",
+                         "viewHistorySidebar", "Browser:AddBookmarkAs", "Browser:BookmarkAllTabs",
+                         "View:PageInfo"];
     var element;
 
     for (let disabledItem of disabledItems) {
       element = document.getElementById(disabledItem);
       if (element)
         element.setAttribute("disabled", "true");
     }
 
     // If no windows are active (i.e. we're the hidden window), disable the close, minimize
     // and zoom menu commands as well
     if (window.location.href == "chrome://browser/content/hiddenWindow.xul") {
-      var hiddenWindowDisabledItems = ['cmd_close', 'minimizeWindow', 'zoomWindow'];
+      var hiddenWindowDisabledItems = ["cmd_close", "minimizeWindow", "zoomWindow"];
       for (let hiddenWindowDisabledItem of hiddenWindowDisabledItems) {
         element = document.getElementById(hiddenWindowDisabledItem);
         if (element)
           element.setAttribute("disabled", "true");
       }
 
       // also hide the window-list separator
       element = document.getElementById("sep-window-list");
@@ -1723,17 +1723,17 @@ function HandleAppCommandEvent(evt) {
     break;
   case "Close":
     BrowserCloseTabOrWindow();
     break;
   case "Find":
     gFindBar.onFindCommand();
     break;
   case "Help":
-    openHelpLink('firefox-help');
+    openHelpLink("firefox-help");
     break;
   case "Open":
     BrowserOpenFileWindow();
     break;
   case "Print":
     PrintUtils.printWindow(gBrowser.selectedBrowser.outerWindowID,
                            gBrowser.selectedBrowser);
     break;
@@ -2932,18 +2932,18 @@ var BrowserOnClick = {
               params.prefetchCert = true;
             case 1 : // Pre-populate
               params.location = location;
           }
         } catch (e) {
           Components.utils.reportError("Couldn't get ssl_override pref: " + e);
         }
 
-        window.openDialog('chrome://pippki/content/exceptionDialog.xul',
-                          '', 'chrome,centerscreen,modal', params);
+        window.openDialog("chrome://pippki/content/exceptionDialog.xul",
+                          "", "chrome,centerscreen,modal", params);
 
         // If the user added the exception cert, attempt to reload the page
         if (params.exceptionAdded) {
           browser.reload();
         }
         break;
 
       case "returnButton":
@@ -3001,23 +3001,23 @@ var BrowserOnClick = {
     Services.obs.addObserver(tabCloser, "captive-portal-login-success", false);
   },
 
   onAboutBlocked(elementId, reason, isTopFrame, location) {
     // Depending on what page we are displaying here (malware/phishing/unwanted)
     // use the right strings and links for each.
     let bucketName = "";
     let sendTelemetry = false;
-    if (reason === 'malware') {
+    if (reason === "malware") {
       sendTelemetry = true;
       bucketName = "WARNING_MALWARE_PAGE_";
-    } else if (reason === 'phishing') {
+    } else if (reason === "phishing") {
       sendTelemetry = true;
       bucketName = "WARNING_PHISHING_PAGE_";
-    } else if (reason === 'unwanted') {
+    } else if (reason === "unwanted") {
       sendTelemetry = true;
       bucketName = "WARNING_UNWANTED_PAGE_";
     }
     let secHistogram = Services.telemetry.getHistogramById("SECURITY_UI");
     let nsISecTel = Ci.nsISecurityUITelemetry;
     bucketName += isTopFrame ? "TOP_" : "FRAME_";
     switch (elementId) {
       case "getMeOutButton":
@@ -3086,35 +3086,35 @@ var BrowserOnClick = {
 
     let buttons = [{
       label: gNavigatorBundle.getString("safebrowsing.getMeOutOfHereButton.label"),
       accessKey: gNavigatorBundle.getString("safebrowsing.getMeOutOfHereButton.accessKey"),
       callback() { getMeOutOfHere(); }
     }];
 
     let title;
-    if (reason === 'malware') {
+    if (reason === "malware") {
       title = gNavigatorBundle.getString("safebrowsing.reportedAttackSite");
       buttons[1] = {
         label: gNavigatorBundle.getString("safebrowsing.notAnAttackButton.label"),
         accessKey: gNavigatorBundle.getString("safebrowsing.notAnAttackButton.accessKey"),
         callback() {
-          openUILinkIn(gSafeBrowsing.getReportURL('MalwareMistake'), 'tab');
+          openUILinkIn(gSafeBrowsing.getReportURL("MalwareMistake"), "tab");
         }
       };
-    } else if (reason === 'phishing') {
+    } else if (reason === "phishing") {
       title = gNavigatorBundle.getString("safebrowsing.deceptiveSite");
       buttons[1] = {
         label: gNavigatorBundle.getString("safebrowsing.notADeceptiveSiteButton.label"),
         accessKey: gNavigatorBundle.getString("safebrowsing.notADeceptiveSiteButton.accessKey"),
         callback() {
-          openUILinkIn(gSafeBrowsing.getReportURL('PhishMistake'), 'tab');
+          openUILinkIn(gSafeBrowsing.getReportURL("PhishMistake"), "tab");
         }
       };
-    } else if (reason === 'unwanted') {
+    } else if (reason === "unwanted") {
       title = gNavigatorBundle.getString("safebrowsing.reportedUnwantedSite");
       // There is no button for reporting errors since Google doesn't currently
       // provide a URL endpoint for these reports.
     }
 
     let notificationBox = gBrowser.getNotificationBox();
     let value = "blocked-badware-page";
 
@@ -3312,17 +3312,17 @@ function getDetailedCertErrorInfo(locati
   return certErrorDetails;
 }
 
 // TODO: can we pull getDERString and getPEMString in from pippki.js instead of
 // duplicating them here?
 function getDERString(cert) {
   var length = {};
   var derArray = cert.getRawDER(length);
-  var derString = '';
+  var derString = "";
   for (var i = 0; i < derArray.length; i++) {
     derString += String.fromCharCode(derArray[i]);
   }
   return derString;
 }
 
 function getPEMString(cert) {
   var derb64 = btoa(getDERString(cert));
@@ -4048,17 +4048,17 @@ function OpenBrowserWindow(options) {
   // is being closed right after it was opened to avoid leaking.
   Services.obs.addObserver(newDocumentShown, "document-shown", false);
   Services.obs.addObserver(windowClosed, "domwindowclosed", false);
 
   var charsetArg = new String();
   var handler = Components.classes["@mozilla.org/browser/clh;1"]
                           .getService(Components.interfaces.nsIBrowserHandler);
   var defaultArgs = handler.defaultArgs;
-  var wintype = document.documentElement.getAttribute('windowtype');
+  var wintype = document.documentElement.getAttribute("windowtype");
 
   var extraFeatures = "";
   if (options && options.private) {
     extraFeatures = ",private";
     if (!PrivateBrowsingUtils.permanentPrivateBrowsing) {
       // Force the new window to load about:privatebrowsing instead of the default home page
       defaultArgs = "about:privatebrowsing";
     }
@@ -4159,17 +4159,17 @@ function updateEditUIVisibility() {
  * sourceEvent. This attribute is propagated to the top level originAttributes
  * living on the tab's docShell.
  *
  * @param event
  *        A click event on a userContext File Menu option
  */
 function openNewUserContextTab(event) {
   openUILinkIn(BROWSER_NEW_TAB_URL, "tab", {
-    userContextId: parseInt(event.target.getAttribute('data-usercontextid')),
+    userContextId: parseInt(event.target.getAttribute("data-usercontextid")),
   });
 }
 
 /**
  * Updates File Menu User Context UI visibility depending on
  * privacy.userContext.enabled pref state.
  */
 function updateUserContextUIVisibility() {
@@ -4456,26 +4456,26 @@ var XULBrowserWindow = {
           }
         }
 
         this.status = "";
         this.setDefaultStatus(msg);
 
         // Disable menu entries for images, enable otherwise
         if (browser.documentContentType && BrowserUtils.mimeTypeIsTextBased(browser.documentContentType)) {
-          this.isImage.removeAttribute('disabled');
+          this.isImage.removeAttribute("disabled");
         } else {
           canViewSource = false;
-          this.isImage.setAttribute('disabled', 'true');
+          this.isImage.setAttribute("disabled", "true");
         }
 
         if (canViewSource) {
-          this.canViewSource.removeAttribute('disabled');
+          this.canViewSource.removeAttribute("disabled");
         } else {
-          this.canViewSource.setAttribute('disabled', 'true');
+          this.canViewSource.setAttribute("disabled", "true");
         }
       }
 
       this.isBusy = false;
 
       if (this._busyUI) {
         this._busyUI = false;
 
@@ -4508,19 +4508,19 @@ var XULBrowserWindow = {
         }
       }
     }
 
     let browser = gBrowser.selectedBrowser;
 
     // Disable menu entries for images, enable otherwise
     if (browser.documentContentType && BrowserUtils.mimeTypeIsTextBased(browser.documentContentType))
-      this.isImage.removeAttribute('disabled');
+      this.isImage.removeAttribute("disabled");
     else
-      this.isImage.setAttribute('disabled', 'true');
+      this.isImage.setAttribute("disabled", "true");
 
     this.hideOverLinkImmediately = true;
     this.setOverLink("", null);
     this.hideOverLinkImmediately = false;
 
     // We should probably not do this if the value has changed since the user
     // searched
     // Update urlbar only if a new page was loaded on the primary content area
@@ -5328,17 +5328,17 @@ var gHomeButton = {
     this.updateTooltip();
   },
 
   updateTooltip(homeButton) {
     if (!homeButton)
       homeButton = document.getElementById("home-button");
     if (homeButton) {
       var homePage = this.getHomePage();
-      homePage = homePage.replace(/\|/g, ', ');
+      homePage = homePage.replace(/\|/g, ", ");
       if (["about:home", "about:newtab"].includes(homePage.toLowerCase()))
         homeButton.setAttribute("tooltiptext", homeButton.getAttribute("aboutHomeOverrideTooltip"));
       else
         homeButton.setAttribute("tooltiptext", homePage);
     }
   },
 
   getHomePage() {
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -259,21 +259,21 @@ function getSerializedSecurityInfo(docSh
 
   return serhelper.serializeToString(securityInfo);
 }
 
 var AboutNetAndCertErrorListener = {
   init(chromeGlobal) {
     addMessageListener("CertErrorDetails", this);
     addMessageListener("Browser:CaptivePortalFreed", this);
-    chromeGlobal.addEventListener('AboutNetErrorLoad', this, false, true);
-    chromeGlobal.addEventListener('AboutNetErrorOpenCaptivePortal', this, false, true);
-    chromeGlobal.addEventListener('AboutNetErrorSetAutomatic', this, false, true);
-    chromeGlobal.addEventListener('AboutNetErrorOverride', this, false, true);
-    chromeGlobal.addEventListener('AboutNetErrorResetPreferences', this, false, true);
+    chromeGlobal.addEventListener("AboutNetErrorLoad", this, false, true);
+    chromeGlobal.addEventListener("AboutNetErrorOpenCaptivePortal", this, false, true);
+    chromeGlobal.addEventListener("AboutNetErrorSetAutomatic", this, false, true);
+    chromeGlobal.addEventListener("AboutNetErrorOverride", this, false, true);
+    chromeGlobal.addEventListener("AboutNetErrorResetPreferences", this, false, true);
   },
 
   get isAboutNetError() {
     return content.document.documentURI.startsWith("about:neterror");
   },
 
   get isAboutCertError() {
     return content.document.documentURI.startsWith("about:certerror");
@@ -542,21 +542,21 @@ var ClickEventHandler = {
       location: ownerDoc.location.href,
       elementId: targetElement.getAttribute("id"),
       isTopFrame: (ownerDoc.defaultView.parent === ownerDoc.defaultView),
       securityInfoAsString: getSerializedSecurityInfo(docShell),
     });
   },
 
   onAboutBlocked(targetElement, ownerDoc) {
-    var reason = 'phishing';
+    var reason = "phishing";
     if (/e=malwareBlocked/.test(ownerDoc.documentURI)) {
-      reason = 'malware';
+      reason = "malware";
     } else if (/e=unwantedBlocked/.test(ownerDoc.documentURI)) {
-      reason = 'unwanted';
+      reason = "unwanted";
     }
     sendAsyncMessage("Browser:SiteBlockedError", {
       location: ownerDoc.location.href,
       reason,
       elementId: targetElement.getAttribute("id"),
       isTopFrame: (ownerDoc.defaultView.parent === ownerDoc.defaultView)
     });
   },
--- a/browser/base/content/contentSearchUI.js
+++ b/browser/base/content/contentSearchUI.js
@@ -618,17 +618,17 @@ ContentSearchUIController.prototype = {
 
   _updateSearchWithHeader() {
     if (!this._strings) {
       return;
     }
     let searchWithHeader = document.getElementById("contentSearchSearchWithHeader");
     if (this.input.value) {
       searchWithHeader.innerHTML = this._strings.searchForSomethingWith;
-      searchWithHeader.querySelector('.contentSearchSearchWithHeaderSearchText').textContent = this.input.value;
+      searchWithHeader.querySelector(".contentSearchSearchWithHeaderSearchText").textContent = this.input.value;
     } else {
       searchWithHeader.textContent = this._strings.searchWithHeader;
     }
   },
 
   _speculativeConnect() {
     if (this.defaultEngine) {
       this._sendMsg("SpeculativeConnect", this.defaultEngine.name);
--- a/browser/base/content/pageinfo/pageInfo.js
+++ b/browser/base/content/pageinfo/pageInfo.js
@@ -147,18 +147,18 @@ const COL_IMAGE_NODE    = 5;
 const COL_IMAGE_BG      = 6;
 
 // column number to copy from, second argument to pageInfoTreeView's constructor
 const COPYCOL_NONE = -1;
 const COPYCOL_META_CONTENT = 1;
 const COPYCOL_IMAGE = COL_IMAGE_ADDRESS;
 
 // one nsITreeView for each tree in the window
-var gMetaView = new pageInfoTreeView('metatree', COPYCOL_META_CONTENT);
-var gImageView = new pageInfoTreeView('imagetree', COPYCOL_IMAGE);
+var gMetaView = new pageInfoTreeView("metatree", COPYCOL_META_CONTENT);
+var gImageView = new pageInfoTreeView("imagetree", COPYCOL_IMAGE);
 
 gImageView.getCellProperties = function(row, col) {
   var data = gImageView.data[row];
   var item = gImageView.data[row][COL_IMAGE_NODE];
   var props = "";
   if (!checkProtocol(data) ||
       item instanceof HTMLEmbedElement ||
       (item instanceof HTMLObjectElement && !item.type.startsWith("image/")))
@@ -1000,31 +1000,31 @@ function formatNumber(number) {
 function formatDate(datestr, unknown) {
   var date = new Date(datestr);
   if (!date.valueOf())
     return unknown;
 
   const locale = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                  .getService(Components.interfaces.nsIXULChromeRegistry)
                  .getSelectedLocale("global", true);
-  const dtOptions = { year: 'numeric', month: 'long', day: 'numeric',
-                      hour: 'numeric', minute: 'numeric', second: 'numeric' };
+  const dtOptions = { year: "numeric", month: "long", day: "numeric",
+                      hour: "numeric", minute: "numeric", second: "numeric" };
   return date.toLocaleString(locale, dtOptions);
 }
 
 function doCopy() {
   if (!gClipboardHelper)
     return;
 
   var elem = document.commandDispatcher.focusedElement;
 
   if (elem && "treeBoxObject" in elem) {
     var view = elem.view;
     var selection = view.selection;
-    var text = [], tmp = '';
+    var text = [], tmp = "";
     var min = {}, max = {};
 
     var count = selection.getRangeCount();
 
     for (var i = 0; i < count; i++) {
       selection.getRangeAt(i, min, max);
 
       for (var row = min.value; row <= max.value; row++) {
--- a/browser/base/content/pageinfo/permissions.js
+++ b/browser/base/content/pageinfo/permissions.js
@@ -156,23 +156,23 @@ function onCheckboxClick(aPartId) {
     setRadioState(aPartId, perm);
   } else {
     onRadioClick(aPartId);
     command.removeAttribute("disabled");
   }
 }
 
 function onPluginRadioClick(aEvent) {
-  onRadioClick(aEvent.originalTarget.getAttribute("id").split('#')[0]);
+  onRadioClick(aEvent.originalTarget.getAttribute("id").split("#")[0]);
 }
 
 function onRadioClick(aPartId) {
   var radioGroup = document.getElementById(aPartId + "RadioGroup");
   var id = radioGroup.selectedItem.id;
-  var permission = id.split('#')[1];
+  var permission = id.split("#")[1];
   SitePermissions.set(gPermURI, aPartId, permission);
 }
 
 function setRadioState(aPartId, aValue) {
   var radio = document.getElementById(aPartId + "#" + aValue);
   if (radio) {
     radio.radioGroup.selectedItem = radio;
   }
--- a/browser/base/content/tab-content.js
+++ b/browser/base/content/tab-content.js
@@ -100,17 +100,17 @@ addMessageListener("SecondScreen:tab-mir
     let height = content.innerHeight;
     let viewport = {cssWidth: width, cssHeight: height, width, height};
     app.mirror(function() {}, content, viewport, function() {}, content);
   }
 });
 
 var AboutHomeListener = {
   init(chromeGlobal) {
-    chromeGlobal.addEventListener('AboutHomeLoad', this, false, true);
+    chromeGlobal.addEventListener("AboutHomeLoad", this, false, true);
   },
 
   get isAboutHome() {
     return content.document.documentURI.toLowerCase() == "about:home";
   },
 
   handleEvent(aEvent) {
     if (!this.isAboutHome) {
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -4581,19 +4581,19 @@
             return;
 
           if (this.AppConstants.platform == "macosx") {
             if (!aEvent.metaKey)
               return;
 
             var offset = 1;
             switch (aEvent.charCode) {
-              case '}'.charCodeAt(0):
+              case "}".charCodeAt(0):
                 offset = -1;
-              case '{'.charCodeAt(0):
+              case "{".charCodeAt(0):
                 if (window.getComputedStyle(this, null).direction == "ltr")
                   offset *= -1;
                 this.tabContainer.advanceSelectedTab(offset, true);
                 aEvent.preventDefault();
             }
           }
         ]]></body>
       </method>
@@ -6334,17 +6334,17 @@
          * In both cases, it is most likely that the close button area has
          * been accidentally clicked, therefore we do not close the tab.
          *
          * We don't want to ignore processing of more than one click event,
          * though, since the user might actually be repeatedly clicking to
          * close many tabs at once.
          */
         let target = event.originalTarget;
-        if (target.classList.contains('tab-close-button')) {
+        if (target.classList.contains("tab-close-button")) {
           // We preemptively set this to allow the closing-multiple-tabs-
           // in-a-row case.
           if (this._blockDblClick) {
             target._ignoredCloseButtonClicks = true;
           } else if (event.detail > 1 && !target._ignoredCloseButtonClicks) {
             target._ignoredCloseButtonClicks = true;
             event.stopPropagation();
             return;
@@ -6480,17 +6480,17 @@
           canvas.mozOpaque = true;
         }
 
         canvas.width = 160 * scale;
         canvas.height = 90 * scale;
         let toDrag = canvas;
         let dragImageOffset = -16;
         if (gMultiProcessBrowser) {
-          var context = canvas.getContext('2d');
+          var context = canvas.getContext("2d");
           context.fillStyle = "white";
           context.fillRect(0, 0, canvas.width, canvas.height);
 
           let captureListener;
           let platform = this.tabbrowser.AppConstants.platform;
           // On Windows and Mac we can update the drag image during a drag
           // using updateDragImage. On Linux, we can use a panel.
           if (platform == "win" || platform == "macosx") {
@@ -7151,32 +7151,32 @@
       <handler event="mouseout"><![CDATA[
         let anonid = event.originalTarget.getAttribute("anonid");
         if (anonid == "close-button")
           this.mOverCloseButton = false;
 
         this._mouseleave();
       ]]></handler>
       <handler event="dragstart" phase="capturing">
-        this.style.MozUserFocus = '';
+        this.style.MozUserFocus = "";
       </handler>
       <handler event="mousedown" phase="capturing">
       <![CDATA[
         if (this.selected) {
-          this.style.MozUserFocus = 'ignore';
+          this.style.MozUserFocus = "ignore";
           this.clientTop; // just using this to flush style updates
         } else if (this.mOverCloseButton ||
                    this._overPlayingIcon) {
           // Prevent tabbox.xml from selecting the tab.
           event.stopPropagation();
         }
       ]]>
       </handler>
       <handler event="mouseup">
-        this.style.MozUserFocus = '';
+        this.style.MozUserFocus = "";
       </handler>
       <handler event="click">
       <![CDATA[
         if (event.button != 0) {
           return;
         }
 
         if (this._overPlayingIcon) {
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -420,16 +420,17 @@ support-files =
   close_beforeunload.html
 [browser_tabs_isActive.js]
 [browser_tabs_owner.js]
 [browser_temporary_permissions.js]
 support-files =
   permissions.html
   temporary_permissions_subframe.html
 [browser_temporary_permissions_navigation.js]
+[browser_temporary_permissions_tabs.js]
 [browser_testOpenNewRemoteTabsFromNonRemoteBrowsers.js]
 run-if = e10s
 [browser_trackingUI_1.js]
 tags = trackingprotection
 support-files =
   trackingPage.html
   benignPage.html
 [browser_trackingUI_2.js]
--- a/browser/base/content/test/general/browser_aboutCertError.js
+++ b/browser/base/content/test/general/browser_aboutCertError.js
@@ -374,17 +374,17 @@ function getCertChain(securityInfoAsStri
     certChain += getPEMString(cert);
   }
   return certChain;
 }
 
 function getDERString(cert) {
   var length = {};
   var derArray = cert.getRawDER(length);
-  var derString = '';
+  var derString = "";
   for (var i = 0; i < derArray.length; i++) {
     derString += String.fromCharCode(derArray[i]);
   }
   return derString;
 }
 
 function getPEMString(cert) {
   var derb64 = btoa(getDERString(cert));
--- a/browser/base/content/test/general/browser_blob-channelname.js
+++ b/browser/base/content/test/general/browser_blob-channelname.js
@@ -1,11 +1,11 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 Cu.import("resource://gre/modules/NetUtil.jsm");
 
 function test() {
-    var file = new File([new Blob(['test'], {type: 'text/plain'})], "test-name");
+    var file = new File([new Blob(["test"], {type: "text/plain"})], "test-name");
     var url = URL.createObjectURL(file);
     var channel = NetUtil.newChannel({uri: url, loadUsingSystemPrincipal: true});
 
-    is(channel.contentDispositionFilename, 'test-name', "filename matches");
+    is(channel.contentDispositionFilename, "test-name", "filename matches");
 }
--- a/browser/base/content/test/general/browser_bookmark_titles.js
+++ b/browser/base/content/test/general/browser_bookmark_titles.js
@@ -1,27 +1,27 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 // This file is tests for the default titles that new bookmarks get.
 
 var tests = [
     // Common page.
-    ['http://example.com/browser/browser/base/content/test/general/dummy_page.html',
-     'Dummy test page'],
+    ["http://example.com/browser/browser/base/content/test/general/dummy_page.html",
+     "Dummy test page"],
     // Data URI.
-    ['data:text/html;charset=utf-8,<title>test%20data:%20url</title>',
-     'test data: url'],
+    ["data:text/html;charset=utf-8,<title>test%20data:%20url</title>",
+     "test data: url"],
     // about:neterror
-    ['data:application/vnd.mozilla.xul+xml,',
-     'data:application/vnd.mozilla.xul+xml,'],
+    ["data:application/vnd.mozilla.xul+xml,",
+     "data:application/vnd.mozilla.xul+xml,"],
     // about:certerror
-    ['https://untrusted.example.com/somepage.html',
-     'https://untrusted.example.com/somepage.html']
+    ["https://untrusted.example.com/somepage.html",
+     "https://untrusted.example.com/somepage.html"]
 ];
 
 add_task(function* () {
     gBrowser.selectedTab = gBrowser.addTab();
     let browser = gBrowser.selectedBrowser;
     browser.stop(); // stop the about:blank load.
 
     // Test that a bookmark of each URI gets the corresponding default title.
@@ -35,35 +35,35 @@ add_task(function* () {
     }
 
     // Network failure test: now that dummy_page.html is in history, bookmarking
     // it should give the last known page title as the default bookmark title.
 
     // Simulate a network outage with offline mode. (Localhost is still
     // accessible in offline mode, so disable the test proxy as well.)
     BrowserOffline.toggleOfflineStatus();
-    let proxy = Services.prefs.getIntPref('network.proxy.type');
-    Services.prefs.setIntPref('network.proxy.type', 0);
+    let proxy = Services.prefs.getIntPref("network.proxy.type");
+    Services.prefs.setIntPref("network.proxy.type", 0);
     registerCleanupFunction(function() {
         BrowserOffline.toggleOfflineStatus();
-        Services.prefs.setIntPref('network.proxy.type', proxy);
+        Services.prefs.setIntPref("network.proxy.type", proxy);
     });
 
     // LOAD_FLAGS_BYPASS_CACHE isn't good enough. So clear the cache.
     Services.cache2.clear();
 
     let [uri, title] = tests[0];
 
     let promiseLoaded = promisePageLoaded(browser);
     BrowserTestUtils.loadURI(browser, uri);
     yield promiseLoaded;
 
     // The offline mode test is only good if the page failed to load.
     yield ContentTask.spawn(browser, null, function() {
-      is(content.document.documentURI.substring(0, 14), 'about:neterror',
+      is(content.document.documentURI.substring(0, 14), "about:neterror",
           "Offline mode successfully simulated network outage.");
     });
     yield checkBookmark(uri, title);
 
     gBrowser.removeCurrentTab();
 });
 
 // Bookmark the current page and confirm that the new bookmark has the expected
--- a/browser/base/content/test/general/browser_bug1045809.js
+++ b/browser/base/content/test/general/browser_bug1045809.js
@@ -32,31 +32,31 @@ add_task(function* () {
   // Test 3: mixed content must be blocked again
   yield promiseTabLoadEvent(tab);
   yield* test3(gBrowser.getBrowserForTab(tab));
 });
 
 function* test1(gTestBrowser) {
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
-  var x = content.document.getElementsByTagName('iframe')[0].contentDocument.getElementById('mixedContentContainer');
+  var x = content.document.getElementsByTagName("iframe")[0].contentDocument.getElementById("mixedContentContainer");
   is(x, null, "Mixed Content is NOT to be found in Test1");
 
   // Disable Mixed Content Protection for the page (and reload)
   gIdentityHandler.disableMixedContentProtection();
 }
 
 function* test2(gTestBrowser) {
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
 
-  var x = content.document.getElementsByTagName('iframe')[0].contentDocument.getElementById('mixedContentContainer');
+  var x = content.document.getElementsByTagName("iframe")[0].contentDocument.getElementById("mixedContentContainer");
   isnot(x, null, "Mixed Content is to be found in Test2");
 
   // Re-enable Mixed Content Protection for the page (and reload)
   gIdentityHandler.enableMixedContentProtection();
 }
 
 function* test3(gTestBrowser) {
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
-  var x = content.document.getElementsByTagName('iframe')[0].contentDocument.getElementById('mixedContentContainer');
+  var x = content.document.getElementsByTagName("iframe")[0].contentDocument.getElementById("mixedContentContainer");
   is(x, null, "Mixed Content is NOT to be found in Test3");
 }
--- a/browser/base/content/test/general/browser_bug1261299.js
+++ b/browser/base/content/test/general/browser_bug1261299.js
@@ -6,17 +6,17 @@
 /**
  * Tests for Bug 1261299
  * Test that the service menu code path is called properly and the
  * current selection (transferable) is cached properly on the parent process.
  */
 
 add_task(function* test_content_and_chrome_selection() {
   let testPage =
-    'data:text/html,' +
+    "data:text/html," +
     '<textarea id="textarea">Write something here</textarea>';
   let DOMWindowUtils = EventUtils._getDOMWindowUtils(window);
   let selectedText;
 
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, testPage);
   yield BrowserTestUtils.synthesizeMouse("#textarea", 0, 0, {}, gBrowser.selectedBrowser);
   yield BrowserTestUtils.synthesizeKey("KEY_ArrowRight",
       {shiftKey: true, ctrlKey: true, code: "ArrowRight"}, gBrowser.selectedBrowser);
@@ -35,20 +35,20 @@ add_task(function* test_content_and_chro
 
 // Test switching active selection.
 // Each tab has a content selection and when you switch to that tab, its selection becomes
 // active aka the current selection.
 // Expect: The active selection is what is being sent to OSX service menu.
 
 add_task(function* test_active_selection_switches_properly() {
   let testPage1 =
-    'data:text/html,' +
+    "data:text/html," +
     '<textarea id="textarea">Write something here</textarea>';
   let testPage2 =
-    'data:text/html,' +
+    "data:text/html," +
     '<textarea id="textarea">Nothing available</textarea>';
   let DOMWindowUtils = EventUtils._getDOMWindowUtils(window);
   let selectedText;
 
   let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, testPage1);
   yield BrowserTestUtils.synthesizeMouse("#textarea", 0, 0, {}, gBrowser.selectedBrowser);
   yield BrowserTestUtils.synthesizeKey("KEY_ArrowRight",
       {shiftKey: true, ctrlKey: true, code: "ArrowRight"}, gBrowser.selectedBrowser);
--- a/browser/base/content/test/general/browser_bug1297539.js
+++ b/browser/base/content/test/general/browser_bug1297539.js
@@ -49,48 +49,48 @@ function* cutCurrentSelection(elementQue
         `${contentElementQueryString} should be empty after cut (superkey + x)`);
     });
 }
 
 // Test that you are able to pasteTransferable for plain text
 // which is handled by TextEditor::PasteTransferable to paste into the editor.
 add_task(function* test_paste_transferable_plain_text() {
   let testPage =
-    'data:text/html,' +
+    "data:text/html," +
     '<textarea id="textarea">Write something here</textarea>';
 
   yield BrowserTestUtils.withNewTab(testPage, function* (browser) {
     // Select all the content in your editor element.
     yield BrowserTestUtils.synthesizeMouse("#textarea", 0, 0, {}, browser);
     yield BrowserTestUtils.synthesizeKey("a", {accelKey: true}, browser);
 
     yield* cutCurrentSelection("#textarea", "value", browser);
 
     let trans = getTransferableFromClipboard(false);
     let DOMWindowUtils = EventUtils._getDOMWindowUtils(window);
     DOMWindowUtils.sendContentCommandEvent("pasteTransferable", trans);
 
     yield ContentTask.spawn(browser, null, function* () {
-      let textArea = content.document.querySelector('#textarea');
+      let textArea = content.document.querySelector("#textarea");
       is(textArea.value, "Write something here",
          "Send content command pasteTransferable successful");
     });
   });
 });
 
 // Test that you are able to pasteTransferable for html
 // which is handled by HTMLEditor::PasteTransferable to paste into the editor.
 //
 // On Linux,
 // BrowserTestUtils.synthesizeKey("a", {accelKey: true}, browser);
 // doesn't seem to trigger for contenteditable which is why we use
 // Selection to select the contenteditable contents.
 add_task(function* test_paste_transferable_html() {
   let testPage =
-    'data:text/html,' +
+    "data:text/html," +
     '<div contenteditable="true"><b>Bold Text</b><i>italics</i></div>';
 
   yield BrowserTestUtils.withNewTab(testPage, function* (browser) {
     // Select all the content in your editor element.
     yield BrowserTestUtils.synthesizeMouse("div", 0, 0, {}, browser);
     yield ContentTask.spawn(browser, {}, function* () {
       let element = content.document.querySelector("div");
       let selection = content.window.getSelection();
@@ -99,14 +99,14 @@ add_task(function* test_paste_transferab
 
     yield* cutCurrentSelection("div", "textContent", browser);
 
     let trans = getTransferableFromClipboard(true);
     let DOMWindowUtils = EventUtils._getDOMWindowUtils(window);
     DOMWindowUtils.sendContentCommandEvent("pasteTransferable", trans);
 
     yield ContentTask.spawn(browser, null, function* () {
-      let textArea = content.document.querySelector('div');
+      let textArea = content.document.querySelector("div");
       is(textArea.innerHTML, "<b>Bold Text</b><i>italics</i>",
          "Send content command pasteTransferable successful");
     });
   });
 });
--- a/browser/base/content/test/general/browser_bug321000.js
+++ b/browser/base/content/test/general/browser_bug321000.js
@@ -5,22 +5,22 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 const kTestString = "  hello hello  \n  world\nworld  ";
 
 var gTests = [
 
   { desc: "Urlbar strips newlines and surrounding whitespace",
     element: gURLBar,
-    expected: kTestString.replace(/\s*\n\s*/g, '')
+    expected: kTestString.replace(/\s*\n\s*/g, "")
   },
 
   { desc: "Searchbar replaces newlines with spaces",
-    element: document.getElementById('searchbar'),
-    expected: kTestString.replace(/\n/g, ' ')
+    element: document.getElementById("searchbar"),
+    expected: kTestString.replace(/\n/g, " ")
   },
 
 ];
 
 // Test for bug 23485 and bug 321000.
 // Urlbar should strip newlines,
 // search bar should replace newlines with spaces.
 function test() {
--- a/browser/base/content/test/general/browser_bug423833.js
+++ b/browser/base/content/test/general/browser_bug423833.js
@@ -1,13 +1,13 @@
 /* Tests for proper behaviour of "Show this frame" context menu options */
 
 // Two frames, one with text content, the other an error page
-var invalidPage = 'http://127.0.0.1:55555/';
-var validPage = 'http://example.com/';
+var invalidPage = "http://127.0.0.1:55555/";
+var validPage = "http://example.com/";
 var testPage = 'data:text/html,<frameset cols="400,400"><frame src="' + validPage + '"><frame src="' + invalidPage + '"></frameset>';
 
 // Store the tab and window created in tests 2 and 3 respectively
 var test2tab;
 var test3window;
 
 // We use setInterval instead of setTimeout to avoid race conditions on error doc loads
 var intervalID;
--- a/browser/base/content/test/general/browser_bug427559.js
+++ b/browser/base/content/test/general/browser_bug427559.js
@@ -2,19 +2,19 @@
 
 /*
  * Test bug 427559 to make sure focused elements that are no longer on the page
  * will have focus transferred to the window when changing tabs back to that
  * tab with the now-gone element.
  */
 
 // Default focus on a button and have it kill itself on blur.
-const URL = 'data:text/html;charset=utf-8,' +
+const URL = "data:text/html;charset=utf-8," +
             '<body><button onblur="this.remove()">' +
-            '<script>document.body.firstChild.focus()</script></body>';
+            "<script>document.body.firstChild.focus()</script></body>";
 
 function getFocusedLocalName(browser) {
   return ContentTask.spawn(browser, null, function* () {
     return content.document.activeElement.localName;
   });
 }
 
 add_task(function* () {
--- a/browser/base/content/test/general/browser_bug553455.js
+++ b/browser/base/content/test/general/browser_bug553455.js
@@ -8,23 +8,23 @@ const SECUREROOT = "https://example.com/
 const XPINSTALL_URL = "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul";
 const PREF_INSTALL_REQUIREBUILTINCERTS = "extensions.install.requireBuiltInCerts";
 const PROGRESS_NOTIFICATION = "addon-progress";
 
 const { REQUIRE_SIGNING } = Cu.import("resource://gre/modules/addons/AddonConstants.jsm", {});
 const { Task } = Cu.import("resource://gre/modules/Task.jsm", {});
 
 var rootDir = getRootDirectory(gTestPath);
-var rootPath = rootDir.split('/');
-var chromeName = rootPath[0] + '//' + rootPath[2];
+var rootPath = rootDir.split("/");
+var chromeName = rootPath[0] + "//" + rootPath[2];
 var croot = chromeName + "/content/browser/toolkit/mozapps/extensions/test/xpinstall/";
 var jar = getJar(croot);
 if (jar) {
   var tmpdir = extractJarToTmp(jar);
-  croot = 'file://' + tmpdir.path + '/';
+  croot = "file://" + tmpdir.path + "/";
 }
 const CHROMEROOT = croot;
 
 var gApp = document.getElementById("bundle_brand").getString("brandShortName");
 var gVersion = Services.appinfo.version;
 
 function getObserverTopic(aNotificationId) {
   let topic = aNotificationId;
--- a/browser/base/content/test/general/browser_bug561636.js
+++ b/browser/base/content/test/general/browser_bug561636.js
@@ -1,19 +1,19 @@
-var gInvalidFormPopup = document.getElementById('invalid-form-popup');
+var gInvalidFormPopup = document.getElementById("invalid-form-popup");
 ok(gInvalidFormPopup,
    "The browser should have a popup to show when a form is invalid");
 
 function checkPopupShow() {
-  ok(gInvalidFormPopup.state == 'showing' || gInvalidFormPopup.state == 'open',
+  ok(gInvalidFormPopup.state == "showing" || gInvalidFormPopup.state == "open",
      "[Test " + testId + "] The invalid form popup should be shown");
 }
 
 function checkPopupHide() {
-  ok(gInvalidFormPopup.state != 'showing' && gInvalidFormPopup.state != 'open',
+  ok(gInvalidFormPopup.state != "showing" && gInvalidFormPopup.state != "open",
      "[Test " + testId + "] The invalid form popup should not be shown");
 }
 
 var gObserver = {
   QueryInterface : XPCOMUtils.generateQI([Ci.nsIFormSubmitObserver]),
 
   notifyInvalidSubmit(aFormElement, aInvalidElements) {
   }
@@ -46,34 +46,34 @@ function* openNewTab(uri, background) {
     gBrowser.selectedTab = tab;
   }
   yield promiseTabLoadEvent(tab, "data:text/html," + escape(uri));
   return browser;
 }
 
 function* clickChildElement(browser) {
   yield ContentTask.spawn(browser, {}, function* () {
-    content.document.getElementById('s').click();
+    content.document.getElementById("s").click();
   });
 }
 
 function* blurChildElement(browser) {
   yield ContentTask.spawn(browser, {}, function* () {
-    content.document.getElementById('i').blur();
+    content.document.getElementById("i").blur();
   });
 }
 
 function* checkChildFocus(browser, message) {
   yield ContentTask.spawn(browser, [message, testId], function* (args) {
     let [msg, id] = args;
-    var focused = content.document.activeElement == content.document.getElementById('i');
+    var focused = content.document.activeElement == content.document.getElementById("i");
 
     var validMsg = true;
     if (msg) {
-      validMsg = (msg == content.document.getElementById('i').validationMessage);
+      validMsg = (msg == content.document.getElementById("i").validationMessage);
     }
 
     Assert.equal(focused, true, "Test " + id + " First invalid element should be focused");
     Assert.equal(validMsg, true, "Test " + id + " The panel should show the message from validationMessage");
   });
 }
 
 /**
@@ -280,17 +280,17 @@ add_task(function* () {
         gObserver.notifyInvalidSubmit = function() {};
         resolve();
       });
     };
 
     Services.obs.addObserver(gObserver, "invalidformsubmit", false);
 
     executeSoon(function() {
-      browser.contentDocument.getElementById('s').click();
+      browser.contentDocument.getElementById("s").click();
     });
   });
 
   yield notifierPromise;
 
   gBrowser.removeTab(gBrowser.getTabForBrowser(browser));
 });
 
@@ -325,18 +325,18 @@ add_task(function* () {
 
   let popupShownPromise = promiseWaitForEvent(gInvalidFormPopup, "popupshown");
   yield clickChildElement(browser);
   yield popupShownPromise;
 
   checkPopupShow();
   yield checkChildFocus(browser, gInvalidFormPopup.firstChild.textContent);
 
-  let inputPromise = promiseWaitForEvent(gBrowser.contentDocument.getElementById('i'), "input");
-  EventUtils.synthesizeKey('f', {});
+  let inputPromise = promiseWaitForEvent(gBrowser.contentDocument.getElementById("i"), "input");
+  EventUtils.synthesizeKey("f", {});
   yield inputPromise;
 
   // Now, the element suffers from another error, the message should have
   // been updated.
   yield new Promise((resolve, reject) => {
     // XXXndeakin This isn't really going to work when the content is another process
     executeSoon(function() {
       checkChildFocus(browser, gInvalidFormPopup.firstChild.textContent);
--- a/browser/base/content/test/general/browser_bug595507.js
+++ b/browser/base/content/test/general/browser_bug595507.js
@@ -1,36 +1,36 @@
 /**
  * Make sure that the form validation error message shows even if the form is in an iframe.
  */
 add_task(function* () {
   let uri = "<iframe src=\"data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input required id='i'><input id='s' type='submit'></form>\"</iframe>";
 
-  var gInvalidFormPopup = document.getElementById('invalid-form-popup');
+  var gInvalidFormPopup = document.getElementById("invalid-form-popup");
   ok(gInvalidFormPopup,
      "The browser should have a popup to show when a form is invalid");
 
   let tab = gBrowser.addTab();
   let browser = gBrowser.getBrowserForTab(tab);
   gBrowser.selectedTab = tab;
 
   yield promiseTabLoadEvent(tab, "data:text/html," + escape(uri));
 
   let popupShownPromise = promiseWaitForEvent(gInvalidFormPopup, "popupshown");
 
   yield ContentTask.spawn(browser, {}, function* () {
-    content.document.getElementsByTagName('iframe')[0]
-           .contentDocument.getElementById('s').click();
+    content.document.getElementsByTagName("iframe")[0]
+           .contentDocument.getElementById("s").click();
   });
   yield popupShownPromise;
 
   yield ContentTask.spawn(browser, {}, function* () {
-    let childdoc = content.document.getElementsByTagName('iframe')[0].contentDocument;
+    let childdoc = content.document.getElementsByTagName("iframe")[0].contentDocument;
     Assert.equal(childdoc.activeElement, childdoc.getElementById("i"),
       "First invalid element should be focused");
   });
 
-  ok(gInvalidFormPopup.state == 'showing' || gInvalidFormPopup.state == 'open',
+  ok(gInvalidFormPopup.state == "showing" || gInvalidFormPopup.state == "open",
      "The invalid form popup should be shown");
 
   gBrowser.removeCurrentTab();
 });
 
--- a/browser/base/content/test/general/browser_bug633691.js
+++ b/browser/base/content/test/general/browser_bug633691.js
@@ -6,30 +6,30 @@ function test() {
   waitForExplicitFinish();
   gBrowser.selectedTab = gBrowser.addTab("data:text/html,<iframe width='700' height='700'></iframe>");
   // Open a html page with about:certerror in an iframe
   BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(function() {
     return ContentTask.spawn(gBrowser.selectedBrowser, "", function() {
       return new Promise(resolve => {
         info("Running content task");
         let listener = e => {
-          removeEventListener('AboutNetErrorLoad', listener, false, true);
+          removeEventListener("AboutNetErrorLoad", listener, false, true);
           resolve();
         };
-        addEventListener('AboutNetErrorLoad', listener, false, true);
+        addEventListener("AboutNetErrorLoad", listener, false, true);
         let iframe = content.document.querySelector("iframe");
         iframe.src = "https://expired.example.com/";
       });
     }).then(testIframeCert);
   });
 }
 
 function testIframeCert(e) {
   // Confirm that the expert section is hidden
-  var doc = gBrowser.contentDocument.getElementsByTagName('iframe')[0].contentDocument;
+  var doc = gBrowser.contentDocument.getElementsByTagName("iframe")[0].contentDocument;
   var aP = doc.getElementById("badCertAdvancedPanel");
   ok(aP, "Advanced content should exist");
   is_element_hidden(aP, "Advanced content should not be visible by default")
 
   // Clean up
   gBrowser.removeCurrentTab();
 
   finish();
--- a/browser/base/content/test/general/browser_bug822367.js
+++ b/browser/base/content/test/general/browser_bug822367.js
@@ -47,20 +47,20 @@ function MixedTest1A() {
   gTestBrowser.addEventListener("load", MixedTest1B, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 function MixedTest1B() {
-  waitForCondition(() => content.document.getElementById('p1').innerHTML == "hello", MixedTest1C, "Waited too long for mixed script to run in Test 1");
+  waitForCondition(() => content.document.getElementById("p1").innerHTML == "hello", MixedTest1C, "Waited too long for mixed script to run in Test 1");
 }
 function MixedTest1C() {
-  ok(content.document.getElementById('p1').innerHTML == "hello", "Mixed script didn't load in Test 1");
+  ok(content.document.getElementById("p1").innerHTML == "hello", "Mixed script didn't load in Test 1");
   gTestBrowser.removeEventListener("load", MixedTest1B, true);
   MixedTest2();
 }
 
 // Mixed Display Test - Doorhanger should not appear
 function MixedTest2() {
   gTestBrowser.addEventListener("load", MixedTest2A, true);
   var url = gHttpTestRoot2 + "file_bug822367_2.html";
@@ -84,24 +84,24 @@ function MixedTest3A() {
   gTestBrowser.addEventListener("load", MixedTest3B, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 function MixedTest3B() {
-  waitForCondition(() => content.document.getElementById('p1').innerHTML == "hello", MixedTest3C, "Waited too long for mixed script to run in Test 3");
+  waitForCondition(() => content.document.getElementById("p1").innerHTML == "hello", MixedTest3C, "Waited too long for mixed script to run in Test 3");
 }
 function MixedTest3C() {
-  waitForCondition(() => content.document.getElementById('p2').innerHTML == "bye", MixedTest3D, "Waited too long for mixed image to load in Test 3");
+  waitForCondition(() => content.document.getElementById("p2").innerHTML == "bye", MixedTest3D, "Waited too long for mixed image to load in Test 3");
 }
 function MixedTest3D() {
-  ok(content.document.getElementById('p1').innerHTML == "hello", "Mixed script didn't load in Test 3");
-  ok(content.document.getElementById('p2').innerHTML == "bye", "Mixed image didn't load in Test 3");
+  ok(content.document.getElementById("p1").innerHTML == "hello", "Mixed script didn't load in Test 3");
+  ok(content.document.getElementById("p2").innerHTML == "bye", "Mixed image didn't load in Test 3");
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: true});
   MixedTest4();
 }
 
 // Location change - User override on one page doesn't propogate to another page after location change.
 function MixedTest4() {
   gTestBrowser.removeEventListener("load", MixedTest3B, true);
   gTestBrowser.addEventListener("load", MixedTest4A, true);
@@ -120,20 +120,20 @@ function MixedTest4A() {
 function MixedTest4B() {
   waitForCondition(() => content.document.location == gHttpTestRoot + "file_bug822367_4B.html", MixedTest4C, "Waited too long for mixed script to run in Test 4");
 }
 function MixedTest4C() {
   ok(content.document.location == gHttpTestRoot + "file_bug822367_4B.html", "Location didn't change in test 4");
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
-  waitForCondition(() => content.document.getElementById('p1').innerHTML == "", MixedTest4D, "Mixed script loaded in test 4 after location change!");
+  waitForCondition(() => content.document.getElementById("p1").innerHTML == "", MixedTest4D, "Mixed script loaded in test 4 after location change!");
 }
 function MixedTest4D() {
-  ok(content.document.getElementById('p1').innerHTML == "", "p1.innerHTML changed; mixed script loaded after location change in Test 4");
+  ok(content.document.getElementById("p1").innerHTML == "", "p1.innerHTML changed; mixed script loaded after location change in Test 4");
   MixedTest5();
 }
 
 // Mixed script attempts to load in a document.open()
 function MixedTest5() {
   gTestBrowser.removeEventListener("load", MixedTest4B, true);
   gTestBrowser.addEventListener("load", MixedTest5A, true);
   var url = gHttpTestRoot + "file_bug822367_5.html";
@@ -144,20 +144,20 @@ function MixedTest5A() {
   gTestBrowser.addEventListener("load", MixedTest5B, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 function MixedTest5B() {
-  waitForCondition(() => content.document.getElementById('p1').innerHTML == "hello", MixedTest5C, "Waited too long for mixed script to run in Test 5");
+  waitForCondition(() => content.document.getElementById("p1").innerHTML == "hello", MixedTest5C, "Waited too long for mixed script to run in Test 5");
 }
 function MixedTest5C() {
-  ok(content.document.getElementById('p1').innerHTML == "hello", "Mixed script didn't load in Test 5");
+  ok(content.document.getElementById("p1").innerHTML == "hello", "Mixed script didn't load in Test 5");
   MixedTest6();
 }
 
 // Mixed script attempts to load in a document.open() that is within an iframe.
 function MixedTest6() {
   gTestBrowser.removeEventListener("load", MixedTest5B, true);
   gTestBrowser.addEventListener("load", MixedTest6A, true);
   var url = gHttpTestRoot2 + "file_bug822367_6.html";
@@ -177,19 +177,19 @@ function MixedTest6B() {
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 
 function MixedTest6C() {
   gTestBrowser.removeEventListener("load", MixedTest6C, true);
   waitForCondition(function() {
     try {
-      return content.document.getElementById('f1').contentDocument.getElementById('p1').innerHTML == "hello";
+      return content.document.getElementById("f1").contentDocument.getElementById("p1").innerHTML == "hello";
     } catch (e) {
       return false;
     }
   }, MixedTest6D, "Waited too long for mixed script to run in Test 6");
 }
 function MixedTest6D() {
-  ok(content.document.getElementById('f1').contentDocument.getElementById('p1').innerHTML == "hello", "Mixed script didn't load in Test 6");
+  ok(content.document.getElementById("f1").contentDocument.getElementById("p1").innerHTML == "hello", "Mixed script didn't load in Test 6");
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
   MixedTestsCompleted();
 }
--- a/browser/base/content/test/general/browser_bug839103.js
+++ b/browser/base/content/test/general/browser_bug839103.js
@@ -41,20 +41,20 @@ function continueTest() {
   let doc = gBrowser.contentDocument;
   doc.styleSheetChangeEventsEnabled = true;
   doc.addEventListener("StyleSheetAdded", unexpectedContentEvent);
   doc.addEventListener("StyleSheetRemoved", unexpectedContentEvent);
   doc.addEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent);
   doc.defaultView.addEventListener("StyleSheetAdded", unexpectedContentEvent);
   doc.defaultView.addEventListener("StyleSheetRemoved", unexpectedContentEvent);
   doc.defaultView.addEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent);
-  let link = doc.createElement('link');
-  link.setAttribute('rel', 'stylesheet');
-  link.setAttribute('type', 'text/css');
-  link.setAttribute('href', gTestRoot + gStyleSheet);
+  let link = doc.createElement("link");
+  link.setAttribute("rel", "stylesheet");
+  link.setAttribute("type", "text/css");
+  link.setAttribute("href", gTestRoot + gStyleSheet);
   gLinkElement = link;
 
   gBrowser.addEventListener("StyleSheetAdded", dynamicStylesheetAdded, true);
   gBrowser.addEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChanged, true);
   doc.body.appendChild(link);
 }
 
 function dynamicStylesheetAdded(evt) {
--- a/browser/base/content/test/general/browser_bug902156.js
+++ b/browser/base/content/test/general/browser_bug902156.js
@@ -52,38 +52,38 @@ function test1A() {
   // Disable Mixed Content Protection for the page (and reload)
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 
 function test1B() {
   var expected = "Mixed Content Blocker disabled";
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test1C, "Error: Waited too long for mixed script to run in Test 1B");
 }
 
 function test1C() {
-  var actual = content.document.getElementById('mctestdiv').innerHTML;
+  var actual = content.document.getElementById("mctestdiv").innerHTML;
   is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 1C");
 
   // The Script loaded after we disabled the page, now we are going to reload the
   // page and see if our decision is persistent
   BrowserTestUtils.browserLoaded(gTestBrowser).then(test1D);
 
   var url = gHttpTestRoot1 + "file_bug902156_2.html";
   gTestBrowser.loadURI(url);
 }
 
 function test1D() {
   // The Control Center button should appear but isMixedContentBlocked should be NOT true,
   // because our decision of disabling the mixed content blocker is persistent.
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
 
-  var actual = content.document.getElementById('mctestdiv').innerHTML;
+  var actual = content.document.getElementById("mctestdiv").innerHTML;
   is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 1D");
 
   // move on to Test 2
   test2();
 }
 
 // ------------------------ Test 2 ------------------------------
 
@@ -101,39 +101,39 @@ function test2A() {
   // Disable Mixed Content Protection for the page (and reload)
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 
 function test2B() {
   var expected = "Mixed Content Blocker disabled";
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test2C, "Error: Waited too long for mixed script to run in Test 2B");
 }
 
 function test2C() {
-  var actual = content.document.getElementById('mctestdiv').innerHTML;
+  var actual = content.document.getElementById("mctestdiv").innerHTML;
   is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 2C");
 
   // The Script loaded after we disabled the page, now we are going to reload the
   // page and see if our decision is persistent
   BrowserTestUtils.browserLoaded(gTestBrowser).then(test2D);
 
   // reload the page using the provided link in the html file
   var mctestlink = content.document.getElementById("mctestlink");
   mctestlink.click();
 }
 
 function test2D() {
   // The Control Center button should appear but isMixedContentBlocked should be NOT true,
   // because our decision of disabling the mixed content blocker is persistent.
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
 
-  var actual = content.document.getElementById('mctestdiv').innerHTML;
+  var actual = content.document.getElementById("mctestdiv").innerHTML;
   is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 2D");
 
   // move on to Test 3
   test3();
 }
 
 // ------------------------ Test 3 ------------------------------
 
--- a/browser/base/content/test/general/browser_bug906190.js
+++ b/browser/base/content/test/general/browser_bug906190.js
@@ -29,17 +29,17 @@ function* doTest(parentTabSpec, childTab
     });
 
     // Disable the Mixed Content Blocker for the page, which reloads it.
     let promiseReloaded = BrowserTestUtils.browserLoaded(browser);
     gIdentityHandler.disableMixedContentProtection();
     yield promiseReloaded;
 
     // Wait for the script in the page to update the contents of the test div.
-    let testDiv = content.document.getElementById('mctestdiv');
+    let testDiv = content.document.getElementById("mctestdiv");
     yield promiseWaitForCondition(
       () => testDiv.innerHTML == "Mixed Content Blocker disabled");
 
     // Add the link for the child tab to the page.
     let mainDiv = content.document.createElement("div");
     mainDiv.innerHTML =
       '<p><a id="linkToOpenInNewTab" href="' + childTabSpec + '">Link</a></p>';
     content.document.body.appendChild(mainDiv);
@@ -115,17 +115,17 @@ add_task(function* test_same_origin() {
                gHttpTestRoot1 + "file_bug906190_2.html", function* () {
     // The doorhanger should appear but activeBlocked should be >> NOT << true,
     // because our decision of disabling the mixed content blocker is persistent
     // across tabs.
     yield assertMixedContentBlockingState(gBrowser, {
       activeLoaded: true, activeBlocked: false, passiveLoaded: false,
     });
 
-    is(content.document.getElementById('mctestdiv').innerHTML,
+    is(content.document.getElementById("mctestdiv").innerHTML,
        "Mixed Content Blocker disabled", "OK: Executed mixed script");
   });
 });
 
 /**
  * 2. - Load a html page which has mixed content
  *    - Doorhanger to disable protection appears - we disable it
  *    - Load a new page from a different origin in a new tab simulating a click
@@ -136,17 +136,17 @@ add_task(function* test_different_origin
                gHttpTestRoot2 + "file_bug906190_2.html", function* () {
     // The doorhanger should appear and activeBlocked should be >> TRUE <<,
     // because our decision of disabling the mixed content blocker should only
     // persist if pages are from the same domain.
     yield assertMixedContentBlockingState(gBrowser, {
       activeLoaded: false, activeBlocked: true, passiveLoaded: false,
     });
 
-    is(content.document.getElementById('mctestdiv').innerHTML,
+    is(content.document.getElementById("mctestdiv").innerHTML,
        "Mixed Content Blocker enabled", "OK: Blocked mixed script");
   });
 });
 
 /**
  * 3. - Load a html page which has mixed content
  *    - Doorhanger to disable protection appears - we disable it
  *    - Load a new page from the same origin in a new tab simulating a click
@@ -157,17 +157,17 @@ add_task(function* test_same_origin_meta
   // file_bug906190_3_4.html redirects to page test1.example.com/* using meta-refresh
   yield doTest(gHttpTestRoot1 + "file_bug906190_1.html",
                gHttpTestRoot1 + "file_bug906190_3_4.html", function* () {
     // The doorhanger should appear but activeBlocked should be >> NOT << true!
     yield assertMixedContentBlockingState(gBrowser, {
       activeLoaded: true, activeBlocked: false, passiveLoaded: false,
     });
 
-    is(content.document.getElementById('mctestdiv').innerHTML,
+    is(content.document.getElementById("mctestdiv").innerHTML,
        "Mixed Content Blocker disabled", "OK: Executed mixed script");
   }, true);
 });
 
 /**
  * 4. - Load a html page which has mixed content
  *    - Doorhanger to disable protection appears - we disable it
  *    - Load a new page from the same origin in a new tab simulating a click
@@ -177,17 +177,17 @@ add_task(function* test_same_origin_meta
 add_task(function* test_same_origin_metarefresh_different_origin() {
   yield doTest(gHttpTestRoot2 + "file_bug906190_1.html",
                gHttpTestRoot2 + "file_bug906190_3_4.html", function* () {
     // The doorhanger should appear and activeBlocked should be >> TRUE <<.
     yield assertMixedContentBlockingState(gBrowser, {
       activeLoaded: false, activeBlocked: true, passiveLoaded: false,
     });
 
-    is(content.document.getElementById('mctestdiv').innerHTML,
+    is(content.document.getElementById("mctestdiv").innerHTML,
        "Mixed Content Blocker enabled", "OK: Blocked mixed script");
   }, true);
 });
 
 /**
  * 5. - Load a html page which has mixed content
  *    - Doorhanger to disable protection appears - we disable it
  *    - Load a new page from the same origin in a new tab simulating a click
@@ -197,17 +197,17 @@ add_task(function* test_same_origin_302r
   // the sjs files returns a 302 redirect- note, same origins
   yield doTest(gHttpTestRoot1 + "file_bug906190_1.html",
                gHttpTestRoot1 + "file_bug906190.sjs", function* () {
     // The doorhanger should appear but activeBlocked should be >> NOT << true.
     // Currently it is >> TRUE << - see follow up bug 914860
     ok(!gIdentityHandler._identityBox.classList.contains("mixedActiveBlocked"),
        "OK: Mixed Content is NOT being blocked");
 
-    is(content.document.getElementById('mctestdiv').innerHTML,
+    is(content.document.getElementById("mctestdiv").innerHTML,
        "Mixed Content Blocker disabled", "OK: Executed mixed script");
   });
 });
 
 /**
  * 6. - Load a html page which has mixed content
  *    - Doorhanger to disable protection appears - we disable it
  *    - Load a new page from the same origin in a new tab simulating a click
@@ -217,17 +217,17 @@ add_task(function* test_same_origin_302r
   // the sjs files returns a 302 redirect - note, different origins
   yield doTest(gHttpTestRoot2 + "file_bug906190_1.html",
                gHttpTestRoot2 + "file_bug906190.sjs", function* () {
     // The doorhanger should appear and activeBlocked should be >> TRUE <<.
     yield assertMixedContentBlockingState(gBrowser, {
       activeLoaded: false, activeBlocked: true, passiveLoaded: false,
     });
 
-    is(content.document.getElementById('mctestdiv').innerHTML,
+    is(content.document.getElementById("mctestdiv").innerHTML,
        "Mixed Content Blocker enabled", "OK: Blocked mixed script");
   });
 });
 
 /**
  * 7. - Test memory leak issue on redirection error. See Bug 1269426.
  */
 add_task(function* test_bad_redirection() {
--- a/browser/base/content/test/general/browser_clipboard.js
+++ b/browser/base/content/test/general/browser_clipboard.js
@@ -144,31 +144,31 @@ add_task(function*() {
         removeEventListener("paste", copyEvent, true);
         let clipboardData = event.clipboardData;
 
         // DataTransfer doesn't support the image types yet, so only text/html
         // will be present.
         if (clipboardData.getData("text/html") !== arg.htmlPrefix +
             '<img id="img" tabindex="1" src="http://example.org/browser/browser/base/content/test/general/moz.png">' +
             arg.htmlPostfix) {
-          reject('Clipboard Data did not contain an image, was ' + clipboardData.getData("text/html"));
+          reject("Clipboard Data did not contain an image, was " + clipboardData.getData("text/html"));
         }
         resolve();
       }, true)
 
       const utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                            .getInterface(Components.interfaces.nsIDOMWindowUtils);
 
       if (utils.sendKeyEvent("keydown", "v", 0, arg.modifier)) {
         utils.sendKeyEvent("keypress", "v", "v".charCodeAt(0), arg.modifier);
       }
       utils.sendKeyEvent("keyup", "v", 0, arg.modifier);
     });
 
     // The new content should now include an image.
     Assert.equal(main.innerHTML, '<i>Italic</i> <img id="img" tabindex="1" ' +
       'src="http://example.org/browser/browser/base/content/test/general/moz.png">' +
-      'Test <b>Bold</b> After<b></b>', "Paste after copy image");
+      "Test <b>Bold</b> After<b></b>", "Paste after copy image");
   });
 
   gBrowser.removeCurrentTab();
 });
 
--- a/browser/base/content/test/general/browser_contentAltClick.js
+++ b/browser/base/content/test/general/browser_contentAltClick.js
@@ -16,17 +16,17 @@ XPCOMUtils.defineLazyModuleGetter(this, 
                                   "resource://gre/modules/Downloads.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PlacesTestUtils",
                                   "resource://testing-common/PlacesTestUtils.jsm");
 
 function setup() {
   gPrefService.setBoolPref("browser.altClickSave", true);
 
   let testPage =
-    'data:text/html,' +
+    "data:text/html," +
     '<p><a id="commonlink" href="http://mochi.test/moz/">Common link</a></p>' +
     '<p><math id="mathxlink" xmlns="http://www.w3.org/1998/Math/MathML" xlink:type="simple" xlink:href="http://mochi.test/moz/"><mtext>MathML XLink</mtext></math></p>' +
     '<p><svg id="svgxlink" xmlns="http://www.w3.org/2000/svg" width="100px" height="50px" version="1.1"><a xlink:type="simple" xlink:href="http://mochi.test/moz/"><text transform="translate(10, 25)">SVG XLink</text></a></svg></p>';
 
   return BrowserTestUtils.openNewForegroundTab(gBrowser, testPage);
 }
 
 function* clean_up() {
--- a/browser/base/content/test/general/browser_csp_block_all_mixedcontent.js
+++ b/browser/base/content/test/general/browser_csp_block_all_mixedcontent.js
@@ -44,12 +44,12 @@ function runTests() {
 }
 
 // ------------------------------------------------------
 function test() {
   // Performing async calls, e.g. 'onload', we have to wait till all of them finished
   waitForExplicitFinish();
 
   SpecialPowers.pushPrefEnv(
-    { 'set': [["security.mixed_content.block_active_content", true]] },
+    { "set": [["security.mixed_content.block_active_content", true]] },
     function() { runTests(); }
   );
 }
--- a/browser/base/content/test/general/browser_discovery.js
+++ b/browser/base/content/test/general/browser_discovery.js
@@ -39,17 +39,17 @@ function runIconDiscoveryTest() {
   var testCase = iconDiscoveryTests[0];
   var head = doc().getElementById("linkparent");
   var hasSrc = gBrowser.getIcon() != null;
   if (testCase.pass)
     ok(hasSrc, testCase.text);
   else
     ok(!hasSrc, testCase.text);
 
-  head.removeChild(head.getElementsByTagName('link')[0]);
+  head.removeChild(head.getElementsByTagName("link")[0]);
   iconDiscoveryTests.shift();
   iconDiscovery(); // Run the next test.
 }
 
 function iconDiscovery() {
   if (iconDiscoveryTests.length) {
     setHandlerFunc(runIconDiscoveryTest);
     gBrowser.setIcon(gBrowser.selectedTab, null,
--- a/browser/base/content/test/general/browser_documentnavigation.js
+++ b/browser/base/content/test/general/browser_documentnavigation.js
@@ -142,17 +142,17 @@ add_task(function* () {
                                false, "back focus content page urlbar");
 });
 
 // Open the sidebar and navigate between the sidebar, content and top-level window
 add_task(function* () {
   let sidebar = document.getElementById("sidebar");
 
   let loadPromise = BrowserTestUtils.waitForEvent(sidebar, "load", true);
-  SidebarUI.toggle('viewBookmarksSidebar');
+  SidebarUI.toggle("viewBookmarksSidebar");
   yield loadPromise;
 
 
   gURLBar.focus();
   yield* expectFocusOnF6(false, "bookmarksPanel",
                                 sidebar.contentDocument.getElementById("search-box").inputField,
                                 false, "focus with sidebar open sidebar");
   yield* expectFocusOnF6(false, "html1", "html1",
@@ -164,17 +164,17 @@ add_task(function* () {
   yield* expectFocusOnF6(true, "html1", "html1",
                                true, "back focus with sidebar open content");
   yield* expectFocusOnF6(true, "bookmarksPanel",
                                sidebar.contentDocument.getElementById("search-box").inputField,
                                false, "back focus with sidebar open sidebar");
   yield* expectFocusOnF6(true, "main-window", gURLBar.inputField,
                                false, "back focus with sidebar urlbar");
 
-  SidebarUI.toggle('viewBookmarksSidebar');
+  SidebarUI.toggle("viewBookmarksSidebar");
 });
 
 // Navigate when the downloads panel is open
 add_task(function* () {
   yield pushPrefs(["accessibility.tabfocus", 7]);
 
   let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown", true);
   EventUtils.synthesizeMouseAtCenter(document.getElementById("downloads-button"), { });
--- a/browser/base/content/test/general/browser_fxa_oauth.js
+++ b/browser/base/content/test/general/browser_fxa_oauth.js
@@ -135,17 +135,17 @@ var gTests = [
       return new Promise(function(resolve, reject) {
         let tabOpened = false;
 
         waitForTab(function(tab) {
           Assert.ok("Tab successfully opened");
 
           // It should have passed in the expected non-matching state value.
           let queryString = gBrowser.currentURI.spec.split("?")[1];
-          Assert.ok(queryString.indexOf('state=different-state') >= 0);
+          Assert.ok(queryString.indexOf("state=different-state") >= 0);
 
           tabOpened = true;
         });
 
         let client = new FxAccountsOAuthClient({
           parameters: {
             state: "different-state",
             client_id: "client_id",
@@ -172,18 +172,18 @@ var gTests = [
     run() {
       return new Promise(function(resolve, reject) {
         let tabOpened = false;
 
         waitForTab(function(tab) {
           Assert.ok("Tab successfully opened");
 
           // It should have asked for keys.
-          let queryString = gBrowser.currentURI.spec.split('?')[1];
-          Assert.ok(queryString.indexOf('keys=true') >= 0);
+          let queryString = gBrowser.currentURI.spec.split("?")[1];
+          Assert.ok(queryString.indexOf("keys=true") >= 0);
 
           tabOpened = true;
         });
 
         let client = new FxAccountsOAuthClient({
           parameters: {
             state: "state",
             client_id: "client_id",
@@ -214,18 +214,18 @@ var gTests = [
     run() {
       return new Promise(function(resolve, reject) {
         let tabOpened = false;
 
         waitForTab(function(tab) {
           Assert.ok("Tab successfully opened");
 
           // It should not have asked for keys.
-          let queryString = gBrowser.currentURI.spec.split('?')[1];
-          Assert.ok(queryString.indexOf('keys=true') == -1);
+          let queryString = gBrowser.currentURI.spec.split("?")[1];
+          Assert.ok(queryString.indexOf("keys=true") == -1);
 
           tabOpened = true;
         });
 
         let client = new FxAccountsOAuthClient({
           parameters: {
             state: "state",
             client_id: "client_id",
@@ -255,18 +255,18 @@ var gTests = [
     run() {
       return new Promise(function(resolve, reject) {
         let tabOpened = false;
 
         waitForTab(function(tab) {
           Assert.ok("Tab successfully opened");
 
           // It should have asked for keys.
-          let queryString = gBrowser.currentURI.spec.split('?')[1];
-          Assert.ok(queryString.indexOf('keys=true') >= 0);
+          let queryString = gBrowser.currentURI.spec.split("?")[1];
+          Assert.ok(queryString.indexOf("keys=true") >= 0);
 
           tabOpened = true;
         });
 
         let client = new FxAccountsOAuthClient({
           parameters: {
             state: "state",
             client_id: "client_id",
--- a/browser/base/content/test/general/browser_fxa_oauth_with_keys.html
+++ b/browser/base/content/test/general/browser_fxa_oauth_with_keys.html
@@ -15,17 +15,17 @@
         message: {
           command: "oauth_complete",
           data: {
             state: "state",
             code: "code1",
             closeWindow: "signin",
             // Keys normally contain more information, but this is enough
             // to keep Loop's tests happy.
-            keys: { kAr: { k: 'kAr' }, kBr: { k: 'kBr' }},
+            keys: { kAr: { k: "kAr" }, kBr: { k: "kBr" }},
           },
         },
       }),
     });
 
     window.dispatchEvent(event);
   };
 </script>
--- a/browser/base/content/test/general/browser_fxa_web_channel.html
+++ b/browser/base/content/test/general/browser_fxa_web_channel.html
@@ -50,20 +50,20 @@
     var event = new window.CustomEvent("WebChannelMessageToChrome", {
       detail: JSON.stringify({
         id: webChannelId,
         message: {
           command: "fxaccounts:login",
           data: {
             authAt: Date.now(),
             email: "testuser@testuser.com",
-            keyFetchToken: 'key_fetch_token',
-            sessionToken: 'session_token',
-            uid: 'uid',
-            unwrapBKey: 'unwrap_b_key',
+            keyFetchToken: "key_fetch_token",
+            sessionToken: "session_token",
+            uid: "uid",
+            unwrapBKey: "unwrap_b_key",
             verified: true,
           },
           messageId: 1,
         },
       }),
     });
 
     window.dispatchEvent(event);
@@ -71,17 +71,17 @@
 
   function test_can_link_account() {
     window.addEventListener("WebChannelMessageToContent", function(e) {
       // echo any responses from the browser back to the tests on the
       // fxaccounts_webchannel_response_echo WebChannel. The tests are
       // listening for events and do the appropriate checks.
       var event = new window.CustomEvent("WebChannelMessageToChrome", {
         detail: JSON.stringify({
-          id: 'fxaccounts_webchannel_response_echo',
+          id: "fxaccounts_webchannel_response_echo",
           message: e.detail.message,
         })
       });
 
       window.dispatchEvent(event);
     }, true);
 
     var event = new window.CustomEvent("WebChannelMessageToChrome", {
@@ -102,34 +102,34 @@
 
   function test_logout() {
     var event = new window.CustomEvent("WebChannelMessageToChrome", {
       detail: JSON.stringify({
         id: webChannelId,
         message: {
           command: "fxaccounts:logout",
           data: {
-            uid: 'uid'
+            uid: "uid"
           },
           messageId: 3,
         },
       }),
     });
 
     window.dispatchEvent(event);
   }
 
   function test_delete() {
     var event = new window.CustomEvent("WebChannelMessageToChrome", {
       detail: JSON.stringify({
         id: webChannelId,
         message: {
           command: "fxaccounts:delete",
           data: {
-            uid: 'uid'
+            uid: "uid"
           },
           messageId: 4,
         },
       }),
     });
 
     window.dispatchEvent(event);
   }
--- a/browser/base/content/test/general/browser_fxa_web_channel.js
+++ b/browser/base/content/test/general/browser_fxa_web_channel.js
@@ -45,22 +45,22 @@ var gTests = [
     }
   },
   {
     desc: "fxa web channel - login messages should notify the fxAccounts object",
     *run() {
 
       let promiseLogin = new Promise((resolve, reject) => {
         let login = (accountData) => {
-          Assert.equal(typeof accountData.authAt, 'number');
-          Assert.equal(accountData.email, 'testuser@testuser.com');
-          Assert.equal(accountData.keyFetchToken, 'key_fetch_token');
-          Assert.equal(accountData.sessionToken, 'session_token');
-          Assert.equal(accountData.uid, 'uid');
-          Assert.equal(accountData.unwrapBKey, 'unwrap_b_key');
+          Assert.equal(typeof accountData.authAt, "number");
+          Assert.equal(accountData.email, "testuser@testuser.com");
+          Assert.equal(accountData.keyFetchToken, "key_fetch_token");
+          Assert.equal(accountData.sessionToken, "session_token");
+          Assert.equal(accountData.uid, "uid");
+          Assert.equal(accountData.unwrapBKey, "unwrap_b_key");
           Assert.equal(accountData.verified, true);
 
           client.tearDown();
           resolve();
         };
 
         let client = new FxAccountsWebChannel({
           content_uri: TEST_HTTP_PATH,
@@ -85,34 +85,34 @@ var gTests = [
       let properUrl = TEST_BASE_URL + "?can_link_account";
 
       let promiseEcho = new Promise((resolve, reject) => {
 
         let webChannelOrigin = Services.io.newURI(properUrl);
         // responses sent to content are echoed back over the
         // `fxaccounts_webchannel_response_echo` channel. Ensure the
         // fxaccounts:can_link_account message is responded to.
-        let echoWebChannel = new WebChannel('fxaccounts_webchannel_response_echo', webChannelOrigin);
+        let echoWebChannel = new WebChannel("fxaccounts_webchannel_response_echo", webChannelOrigin);
         echoWebChannel.listen((webChannelId, message, target) => {
-          Assert.equal(message.command, 'fxaccounts:can_link_account');
+          Assert.equal(message.command, "fxaccounts:can_link_account");
           Assert.equal(message.messageId, 2);
           Assert.equal(message.data.ok, true);
 
           client.tearDown();
           echoWebChannel.stopListening();
 
           resolve();
         });
 
         let client = new FxAccountsWebChannel({
           content_uri: TEST_HTTP_PATH,
           channel_id: TEST_CHANNEL_ID,
           helpers: {
             shouldAllowRelink(acctName) {
-              return acctName === 'testuser@testuser.com';
+              return acctName === "testuser@testuser.com";
             }
           }
         });
       });
 
       yield BrowserTestUtils.withNewTab({
         gBrowser,
         url: properUrl
@@ -121,17 +121,17 @@ var gTests = [
       });
     }
   },
   {
     desc: "fxa web channel - logout messages should notify the fxAccounts object",
     *run() {
       let promiseLogout = new Promise((resolve, reject) => {
         let logout = (uid) => {
-          Assert.equal(uid, 'uid');
+          Assert.equal(uid, "uid");
 
           client.tearDown();
           resolve();
         };
 
         let client = new FxAccountsWebChannel({
           content_uri: TEST_HTTP_PATH,
           channel_id: TEST_CHANNEL_ID,
@@ -149,17 +149,17 @@ var gTests = [
       });
     }
   },
   {
     desc: "fxa web channel - delete messages should notify the fxAccounts object",
     *run() {
       let promiseDelete = new Promise((resolve, reject) => {
         let logout = (uid) => {
-          Assert.equal(uid, 'uid');
+          Assert.equal(uid, "uid");
 
           client.tearDown();
           resolve();
         };
 
         let client = new FxAccountsWebChannel({
           content_uri: TEST_HTTP_PATH,
           channel_id: TEST_CHANNEL_ID,
--- a/browser/base/content/test/general/browser_fxaccounts.js
+++ b/browser/base/content/test/general/browser_fxaccounts.js
@@ -12,17 +12,17 @@ const TEST_ROOT = "http://example.com/br
 // instrument gFxAccounts to send observer notifications when it's done
 // what it does.
 (function() {
   let unstubs = {}; // The original functions we stub out.
 
   // The stub functions.
   let stubs = {
     updateAppMenuItem() {
-      return unstubs['updateAppMenuItem'].call(gFxAccounts).then(() => {
+      return unstubs["updateAppMenuItem"].call(gFxAccounts).then(() => {
         Services.obs.notifyObservers(null, "test:browser_fxaccounts:updateAppMenuItem", null);
       });
     },
     // Opening preferences is trickier than it should be as leaks are reported
     // due to the promises it fires off at load time  and there's no clear way to
     // know when they are done.
     // So just ensure openPreferences is called rather than whether it opens.
     openPreferences() {
--- a/browser/base/content/test/general/browser_mcb_redirect.js
+++ b/browser/base/content/test/general/browser_mcb_redirect.js
@@ -107,17 +107,17 @@ function test1() {
 
 function checkUIForTest1() {
   gTestBrowser.removeEventListener("load", checkUIForTest1, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   var expected = "script blocked";
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test2, "Error: Waited too long for status in Test 1!",
     "OK: Expected result in innerHTML for Test1!");
 }
 
 // ------------------------ Test 2 ------------------------------
 
 function test2() {
   gTestBrowser.addEventListener("load", checkUIForTest2, true);
@@ -127,17 +127,17 @@ function test2() {
 
 function checkUIForTest2() {
   gTestBrowser.removeEventListener("load", checkUIForTest2, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: false, passiveLoaded: false});
 
   var expected = "script executed";
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test3, "Error: Waited too long for status in Test 2!",
     "OK: Expected result in innerHTML for Test2!");
 }
 
 // ------------------------ Test 3 ------------------------------
 // HTTPS page loading insecure image
 function test3() {
   gTestBrowser.addEventListener("load", checkLoadEventForTest3, true);
@@ -145,17 +145,17 @@ function test3() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest3() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest3, true);
 
   var expected = "image blocked"
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test4, "Error: Waited too long for status in Test 3!",
     "OK: Expected result in innerHTML for Test3!");
 }
 
 // ------------------------ Test 4 ------------------------------
 // HTTP page loading insecure image
 function test4() {
   gTestBrowser.addEventListener("load", checkLoadEventForTest4, true);
@@ -163,17 +163,17 @@ function test4() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest4() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest4, true);
 
   var expected = "image loaded"
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test5, "Error: Waited too long for status in Test 4!",
     "OK: Expected result in innerHTML for Test4!");
 }
 
 // ------------------------ Test 5 ------------------------------
 // HTTP page laoding insecure cached image
 // Assuming test 4 succeeded, the image has already been loaded once
 // and hence should be cached per the sjs cache-control header
@@ -186,17 +186,17 @@ function test5() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest5() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest5, true);
 
   var expected = "image loaded"
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test6, "Error: Waited too long for status in Test 5!",
     "OK: Expected result in innerHTML for Test5!");
   // Go back online
   Services.io.offline = false;
 }
 
 // ------------------------ Test 6 ------------------------------
 // HTTPS page loading insecure cached image
@@ -211,17 +211,17 @@ function test6() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest6() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest6, true);
 
   var expected = "image blocked"
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test7, "Error: Waited too long for status in Test 6!",
     "OK: Expected result in innerHTML for Test6!");
   // Go back online
   Services.io.offline = false;
 }
 
 // ------------------------ Test 7 ------------------------------
 // HTTP page loading insecure image that went through a double redirect
@@ -231,17 +231,17 @@ function test7() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest7() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest7, true);
 
   var expected = "image loaded"
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test8, "Error: Waited too long for status in Test 7!",
     "OK: Expected result in innerHTML for Test7!");
 }
 
 // ------------------------ Test 8 ------------------------------
 // HTTP page loading insecure cached image that went through a double redirect
 // Assuming test 7 succeeded, the image has already been loaded once
 // and hence should be cached per the sjs cache-control header
@@ -254,17 +254,17 @@ function test8() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest8() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest8, true);
 
   var expected = "image loaded"
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     test9, "Error: Waited too long for status in Test 8!",
     "OK: Expected result in innerHTML for Test8!");
   // Go back online
   Services.io.offline = false;
 }
 
 // ------------------------ Test 9 ------------------------------
 // HTTPS page loading insecure cached image that went through a double redirect
@@ -279,17 +279,17 @@ function test9() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest9() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest9, true);
 
   var expected = "image blocked"
   waitForCondition(
-    () => content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById("mctestdiv").innerHTML == expected,
     cleanUpAfterTests, "Error: Waited too long for status in Test 9!",
     "OK: Expected result in innerHTML for Test9!");
   // Go back online
   Services.io.offline = false;
 }
 
 // ------------------------ SETUP ------------------------------
 
--- a/browser/base/content/test/general/browser_no_mcb_on_http_site.js
+++ b/browser/base/content/test/general/browser_no_mcb_on_http_site.js
@@ -64,17 +64,17 @@ function waitForCondition(condition, nex
 // ------------- TEST 1 -----------------------------------------
 
 function test1A() {
   gTestBrowser.removeEventListener("load", test1A, true);
 
   var expected = "Verifying MCB does not trigger warning/error for an http page ";
   expected += "with https css that includes http image";
   waitForCondition(
-    () => content.document.getElementById('testDiv').innerHTML == expected,
+    () => content.document.getElementById("testDiv").innerHTML == expected,
     test1B, "Error: Waited too long for status in Test 1!",
     "OK: Expected result in innerHTML!");
 }
 
 function test1B() {
   // set up test 2
   gTestBrowser.addEventListener("load", test2A, true);
   var url = gHttpTestRoot + "test_no_mcb_on_http_site_font.html";
@@ -84,17 +84,17 @@ function test1B() {
 // ------------- TEST 2 -----------------------------------------
 
 function test2A() {
   gTestBrowser.removeEventListener("load", test2A, true);
 
   var expected = "Verifying MCB does not trigger warning/error for an http page ";
   expected += "with https css that includes http font";
   waitForCondition(
-    () => content.document.getElementById('testDiv').innerHTML == expected,
+    () => content.document.getElementById("testDiv").innerHTML == expected,
     test2B, "Error: Waited too long for status in Test 2!",
     "OK: Expected result in innerHTML!");
 }
 
 function test2B() {
   // set up test 3
   gTestBrowser.addEventListener("load", test3, true);
   var url = gHttpTestRoot + "test_no_mcb_on_http_site_font2.html";
@@ -104,17 +104,17 @@ function test2B() {
 // ------------- TEST 3 -----------------------------------------
 
 function test3() {
   gTestBrowser.removeEventListener("load", test3, true);
 
   var expected = "Verifying MCB does not trigger warning/error for an http page "
   expected += "with https css that imports another http css which includes http font";
   waitForCondition(
-    () => content.document.getElementById('testDiv').innerHTML == expected,
+    () => content.document.getElementById("testDiv").innerHTML == expected,
     cleanUpAfterTests, "Error: Waited too long for status in Test 3!",
     "OK: Expected result in innerHTML!");
 }
 
 // ------------------------------------------------------
 
 function test() {
   // Performing async calls, e.g. 'onload', we have to wait till all of them finished
--- a/browser/base/content/test/general/browser_offlineQuotaNotification.js
+++ b/browser/base/content/test/general/browser_offlineQuotaNotification.js
@@ -57,17 +57,17 @@ function test() {
         content.window.applicationCache.oncached = function() {
           setTimeout(resolve, 0);
         };
         sendAsyncMessage("Test:OnCachedAttached");
       });
     });
     gotCached.then(function() {
       // We got cached - now we should have provoked the quota warning.
-      let notification = PopupNotifications.getNotification('offline-app-usage');
+      let notification = PopupNotifications.getNotification("offline-app-usage");
       ok(notification, "have offline-app-usage notification");
       // select the default action - this should cause the preferences
       // tab to open - which we track via an "Initialized" event.
       PopupNotifications.panel.firstElementChild.button.click();
       let newTabBrowser = gBrowser.getBrowserForTab(gBrowser.selectedTab);
       newTabBrowser.addEventListener("Initialized", function PrefInit() {
         newTabBrowser.removeEventListener("Initialized", PrefInit, true);
         executeSoon(function() {
--- a/browser/base/content/test/general/browser_page_style_menu_update.js
+++ b/browser/base/content/test/general/browser_page_style_menu_update.js
@@ -49,17 +49,17 @@ add_task(function*() {
   target.click();
 
   // Now we need to wait for the content process to send its stylesheet
   // update for the selected tab to the parent. Because messages are
   // guaranteed to be sent in order, we'll make sure we do the check
   // after the parent has been updated by yielding until the child
   // has finished running a ContentTask for us.
   yield ContentTask.spawn(browser, {}, function*() {
-    dump('\nJust wasting some time.\n');
+    dump("\nJust wasting some time.\n");
   });
 
   gPageStyleMenu.fillPopup(menupopup);
   // gPageStyleMenu empties out the menu between opens, so we need
   // to get a new reference to the selected menuitem
   selected = menupopup.querySelector("menuitem[checked='true']");
   is(selected.getAttribute("label"), "1", "Should now have stylesheet 1 selected");
 
--- a/browser/base/content/test/general/browser_parsable_css.js
+++ b/browser/base/content/test/general/browser_parsable_css.js
@@ -134,17 +134,17 @@ function getBaseUriForChromeUri(chromeUr
   let chromeFile = chromeUri + "gobbledygooknonexistentfile.reallynothere";
   let uri = Services.io.newURI(chromeFile);
   let fileUri = gChromeReg.convertChromeURL(uri);
   return fileUri.resolve(".");
 }
 
 function parseManifest(manifestUri) {
   return fetchFile(manifestUri.spec).then(data => {
-    for (let line of data.split('\n')) {
+    for (let line of data.split("\n")) {
       let [type, ...argv] = line.split(/\s+/);
       let component;
       if (type == "content" || type == "skin") {
         [component] = argv;
       } else {
         // skip unrelated lines
         continue;
       }
@@ -256,17 +256,17 @@ add_task(function* checkAllTheCSS() {
   let uris = yield generateURIsFromDirTree(appDir, [".css", ".manifest"]);
 
   // Create a clean iframe to load all the files into. This needs to live at a
   // chrome URI so that it's allowed to load and parse any styles.
   let testFile = getRootDirectory(gTestPath) + "dummy_page.html";
   let windowless = Services.appShell.createWindowlessBrowser();
   let iframe = windowless.document.createElementNS("http://www.w3.org/1999/xhtml", "html:iframe");
   windowless.document.documentElement.appendChild(iframe);
-  let iframeLoaded = once(iframe, 'load');
+  let iframeLoaded = once(iframe, "load");
   iframe.contentWindow.location = testFile;
   yield iframeLoaded;
   let doc = iframe.contentWindow.document;
 
   // Parse and remove all manifests from the list.
   // NOTE that this must be done before filtering out devtools paths
   // so that all chrome paths can be recorded.
   let manifestPromises = [];
@@ -359,15 +359,15 @@ add_task(function* checkAllTheCSS() {
       ok(false, "Unused file whitelist item. " +
                 " file: " + item.file +
                 " from: " + item.from);
     }
   }
 
   // Clean up to avoid leaks:
   iframe.remove();
-  doc.head.innerHTML = '';
+  doc.head.innerHTML = "";
   doc = null;
   iframe = null;
   windowless.close();
   windowless = null;
   imageURIsToReferencesMap = null;
 });
--- a/browser/base/content/test/general/browser_remoteTroubleshoot.js
+++ b/browser/base/content/test/general/browser_remoteTroubleshoot.js
@@ -59,17 +59,17 @@ add_task(function*() {
   Assert.equal(got.message.application.buildID, Services.appinfo.appBuildID,
                "should have correct build ID");
 
   let updateChannel = null;
   try {
     updateChannel = Cu.import("resource://gre/modules/UpdateUtils.jsm", {}).UpdateUtils.UpdateChannel;
   } catch (ex) {}
   if (!updateChannel) {
-    Assert.ok(!('updateChannel' in got.message.application),
+    Assert.ok(!("updateChannel" in got.message.application),
                 "should not have update channel where not available.");
   } else {
     Assert.equal(got.message.application.updateChannel, updateChannel,
                  "should have correct update channel.");
   }
 
 
   // And check some keys we know we decline to return.
--- a/browser/base/content/test/general/browser_restore_isAppTab.js
+++ b/browser/base/content/test/general/browser_restore_isAppTab.js
@@ -1,56 +1,56 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const {TabStateFlusher} = Cu.import("resource:///modules/sessionstore/TabStateFlusher.jsm", {});
 
 const DUMMY = "http://example.com/browser/browser/base/content/test/general/dummy_page.html";
 
 function getMinidumpDirectory() {
-  let dir = Services.dirsvc.get('ProfD', Ci.nsIFile);
+  let dir = Services.dirsvc.get("ProfD", Ci.nsIFile);
   dir.append("minidumps");
   return dir;
 }
 
 // This observer is needed so we can clean up all evidence of the crash so
 // the testrunner thinks things are peachy.
 var CrashObserver = {
   observe(subject, topic, data) {
-    is(topic, 'ipc:content-shutdown', 'Received correct observer topic.');
+    is(topic, "ipc:content-shutdown", "Received correct observer topic.");
     ok(subject instanceof Ci.nsIPropertyBag2,
-       'Subject implements nsIPropertyBag2.');
+       "Subject implements nsIPropertyBag2.");
     // we might see this called as the process terminates due to previous tests.
     // We are only looking for "abnormal" exits...
     if (!subject.hasKey("abnormal")) {
       info("This is a normal termination and isn't the one we are looking for...");
       return;
     }
 
     let dumpID;
-    if ('nsICrashReporter' in Ci) {
-      dumpID = subject.getPropertyAsAString('dumpID');
+    if ("nsICrashReporter" in Ci) {
+      dumpID = subject.getPropertyAsAString("dumpID");
       ok(dumpID, "dumpID is present and not an empty string");
     }
 
     if (dumpID) {
       let minidumpDirectory = getMinidumpDirectory();
       let file = minidumpDirectory.clone();
-      file.append(dumpID + '.dmp');
+      file.append(dumpID + ".dmp");
       file.remove(true);
       file = minidumpDirectory.clone();
-      file.append(dumpID + '.extra');
+      file.append(dumpID + ".extra");
       file.remove(true);
     }
   }
 }
-Services.obs.addObserver(CrashObserver, 'ipc:content-shutdown', false);
+Services.obs.addObserver(CrashObserver, "ipc:content-shutdown", false);
 
 registerCleanupFunction(() => {
-  Services.obs.removeObserver(CrashObserver, 'ipc:content-shutdown');
+  Services.obs.removeObserver(CrashObserver, "ipc:content-shutdown");
 });
 
 function frameScript() {
   addMessageListener("Test:GetIsAppTab", function() {
     sendAsyncMessage("Test:IsAppTab", { isAppTab: docShell.isAppTab });
   });
 
   addMessageListener("Test:Crash", function() {
--- a/browser/base/content/test/general/browser_save_link_when_window_navigates.js
+++ b/browser/base/content/test/general/browser_save_link_when_window_navigates.js
@@ -57,17 +57,17 @@ function triggerSave(aWindow, aCallback)
     ok(!destDir.exists(), "Destination dir should be removed");
     ok(!destFile.exists(), "Destination file should be removed");
     mockTransferCallback = null;
     info("done mockTransferCallback");
   }
 
   function onUCTDialog(dialog) {
     function doLoad() {
-      content.document.querySelector('iframe').remove();
+      content.document.querySelector("iframe").remove();
     }
     testBrowser.messageManager.loadFrameScript("data:,(" + doLoad.toString() + ")()", false);
     executeSoon(continueDownloading);
   }
 
   function continueDownloading() {
     let windows = Services.wm.getEnumerator("");
     while (windows.hasMoreElements()) {
--- a/browser/base/content/test/general/browser_syncui.js
+++ b/browser/base/content/test/general/browser_syncui.js
@@ -177,24 +177,24 @@ add_task(function* testButtonActivitiesI
   // check the button's functionality while the button is in the NavBar - which
   // it already is.
   yield doTestButtonActivities();
 });
 
 add_task(function* testFormatLastSyncDateNow() {
   let now = new Date();
   let nowString = gSyncUI.formatLastSyncDate(now);
-  Assert.equal(nowString, "Last sync: " + now.toLocaleDateString(undefined, {weekday: 'long', hour: 'numeric', minute: 'numeric'}));
+  Assert.equal(nowString, "Last sync: " + now.toLocaleDateString(undefined, {weekday: "long", hour: "numeric", minute: "numeric"}));
 });
 
 add_task(function* testFormatLastSyncDateMonthAgo() {
   let monthAgo = new Date();
   monthAgo.setMonth(monthAgo.getMonth() - 1);
   let monthAgoString = gSyncUI.formatLastSyncDate(monthAgo);
-  Assert.equal(monthAgoString, "Last sync: " + monthAgo.toLocaleDateString(undefined, {month: 'long', day: 'numeric'}));
+  Assert.equal(monthAgoString, "Last sync: " + monthAgo.toLocaleDateString(undefined, {month: "long", day: "numeric"}));
 });
 
 add_task(function* testButtonActivitiesInPanel() {
   // check the button's functionality while the button is in the panel - it's
   // currently in the NavBar - move it to the panel and open it.
   CustomizableUI.addWidgetToArea("sync-button", CustomizableUI.AREA_PANEL);
   yield PanelUI.show();
   try {
--- a/browser/base/content/test/general/browser_tabfocus.js
+++ b/browser/base/content/test/general/browser_tabfocus.js
@@ -325,17 +325,17 @@ add_task(function*() {
   // now go back again
   gURLBar.focus();
 
   yield new Promise((resolve, reject) => {
     window.addEventListener("pageshow", function navigationOccured(event) {
       window.removeEventListener("pageshow", navigationOccured, true);
       resolve();
     }, true);
-    document.getElementById('Browser:Back').doCommand();
+    document.getElementById("Browser:Back").doCommand();
   });
 
   is(window.document.activeElement, gURLBar.inputField, "urlbar still focused after navigating back");
 
   // Document navigation with F6 does not yet work in mutli-process browsers.
   if (!gMultiProcessBrowser) {
     gURLBar.focus();
     actualEvents = new EventStore();
--- a/browser/base/content/test/general/browser_temporary_permissions.js
+++ b/browser/base/content/test/general/browser_temporary_permissions.js
@@ -26,77 +26,16 @@ add_task(function* testTempPermissionCha
     Assert.notEqual(geoIcon.boxObject.width, 0, "geo anchor should be visible");
 
     SitePermissions.remove(uri, id, browser);
 
     Assert.equal(geoIcon.boxObject.width, 0, "geo anchor should not be visible");
   });
 });
 
-// Test that temp permissions are persisted through moving tabs to new windows.
-add_task(function* testTempPermissionOnTabMove() {
-  let uri = NetUtil.newURI("https://example.com");
-  let id = "geo";
-
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, uri.spec);
-
-  SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, tab.linkedBrowser);
-
-  Assert.deepEqual(SitePermissions.get(uri, id, tab.linkedBrowser), {
-    state: SitePermissions.BLOCK,
-    scope: SitePermissions.SCOPE_TEMPORARY,
-  });
-
-  let promiseWin = BrowserTestUtils.waitForNewWindow();
-  gBrowser.replaceTabWithWindow(tab);
-  let win = yield promiseWin;
-  tab = win.gBrowser.selectedTab;
-
-  Assert.deepEqual(SitePermissions.get(uri, id, tab.linkedBrowser), {
-    state: SitePermissions.BLOCK,
-    scope: SitePermissions.SCOPE_TEMPORARY,
-  });
-
-  SitePermissions.remove(uri, id, tab.linkedBrowser);
-  yield BrowserTestUtils.closeWindow(win);
-});
-
-// Test that temp permissions don't affect other tabs of the same URI.
-add_task(function* testTempPermissionMultipleTabs() {
-  let uri = NetUtil.newURI("https://example.com");
-  let id = "geo";
-
-  let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, uri.spec);
-  let tab2 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, uri.spec);
-
-  SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, tab2.linkedBrowser);
-
-  Assert.deepEqual(SitePermissions.get(uri, id, tab2.linkedBrowser), {
-    state: SitePermissions.BLOCK,
-    scope: SitePermissions.SCOPE_TEMPORARY,
-  });
-
-  Assert.deepEqual(SitePermissions.get(uri, id, tab1.linkedBrowser), {
-    state: SitePermissions.UNKNOWN,
-    scope: SitePermissions.SCOPE_PERSISTENT,
-  });
-
-  let geoIcon = document.querySelector(".blocked-permission-icon[data-permission-id=geo]");
-
-  Assert.notEqual(geoIcon.boxObject.width, 0, "geo anchor should be visible");
-
-  yield BrowserTestUtils.switchTab(gBrowser, tab1);
-
-  Assert.equal(geoIcon.boxObject.width, 0, "geo anchor should not be visible");
-
-  SitePermissions.remove(uri, id, tab2.linkedBrowser);
-  yield BrowserTestUtils.removeTab(tab1);
-  yield BrowserTestUtils.removeTab(tab2);
-});
-
 // Test that temp blocked permissions requested by subframes (with a different URI) affect the whole page.
 add_task(function* testTempPermissionSubframes() {
   let uri = NetUtil.newURI("https://example.com");
   let id = "geo";
 
   yield BrowserTestUtils.withNewTab(SUBFRAME_PAGE, function*(browser) {
     let popupshown = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown");
 
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/general/browser_temporary_permissions_tabs.js
@@ -0,0 +1,68 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+Cu.import("resource:///modules/SitePermissions.jsm", this);
+
+// Test that temp permissions are persisted through moving tabs to new windows.
+add_task(function* testTempPermissionOnTabMove() {
+  let uri = NetUtil.newURI("https://example.com");
+  let id = "geo";
+
+  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, uri.spec);
+
+  SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, tab.linkedBrowser);
+
+  Assert.deepEqual(SitePermissions.get(uri, id, tab.linkedBrowser), {
+    state: SitePermissions.BLOCK,
+    scope: SitePermissions.SCOPE_TEMPORARY,
+  });
+
+  let promiseWin = BrowserTestUtils.waitForNewWindow();
+  gBrowser.replaceTabWithWindow(tab);
+  let win = yield promiseWin;
+  tab = win.gBrowser.selectedTab;
+
+  Assert.deepEqual(SitePermissions.get(uri, id, tab.linkedBrowser), {
+    state: SitePermissions.BLOCK,
+    scope: SitePermissions.SCOPE_TEMPORARY,
+  });
+
+  SitePermissions.remove(uri, id, tab.linkedBrowser);
+  yield BrowserTestUtils.closeWindow(win);
+});
+
+// Test that temp permissions don't affect other tabs of the same URI.
+add_task(function* testTempPermissionMultipleTabs() {
+  let uri = NetUtil.newURI("https://example.com");
+  let id = "geo";
+
+  let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, uri.spec);
+  let tab2 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, uri.spec);
+
+  SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, tab2.linkedBrowser);
+
+  Assert.deepEqual(SitePermissions.get(uri, id, tab2.linkedBrowser), {
+    state: SitePermissions.BLOCK,
+    scope: SitePermissions.SCOPE_TEMPORARY,
+  });
+
+  Assert.deepEqual(SitePermissions.get(uri, id, tab1.linkedBrowser), {
+    state: SitePermissions.UNKNOWN,
+    scope: SitePermissions.SCOPE_PERSISTENT,
+  });
+
+  let geoIcon = document.querySelector(".blocked-permission-icon[data-permission-id=geo]");
+
+  Assert.notEqual(geoIcon.boxObject.width, 0, "geo anchor should be visible");
+
+  yield BrowserTestUtils.switchTab(gBrowser, tab1);
+
+  Assert.equal(geoIcon.boxObject.width, 0, "geo anchor should not be visible");
+
+  SitePermissions.remove(uri, id, tab2.linkedBrowser);
+  yield BrowserTestUtils.removeTab(tab1);
+  yield BrowserTestUtils.removeTab(tab2);
+});
+
--- a/browser/base/content/test/general/browser_trackingUI_6.js
+++ b/browser/base/content/test/general/browser_trackingUI_6.js
@@ -13,17 +13,17 @@ function waitForSecurityChange(numChange
         }
       }
     };
     gBrowser.addProgressListener(listener);
   });
 }
 
 add_task(function* test_fetch() {
-  yield SpecialPowers.pushPrefEnv({ set: [['privacy.trackingprotection.enabled', true]] });
+  yield SpecialPowers.pushPrefEnv({ set: [["privacy.trackingprotection.enabled", true]] });
 
   yield BrowserTestUtils.withNewTab({ gBrowser, url: URL }, function* (newTabBrowser) {
     let securityChange = waitForSecurityChange();
     yield ContentTask.spawn(newTabBrowser, null, function* () {
       yield content.wrappedJSObject.test_fetch()
                    .then(response => Assert.ok(false, "should have denied the request"))
                    .catch(e => Assert.ok(true, `Caught exception: ${e}`));
     });
--- a/browser/base/content/test/general/content_aboutAccounts.js
+++ b/browser/base/content/test/general/content_aboutAccounts.js
@@ -47,19 +47,19 @@ addEventListener("DOMContentLoaded", fun
 
 // Return the visibility state of a list of ids.
 addMessageListener("test:check-visibilities", function(message) {
   let result = {};
   for (let id of message.data.ids) {
     let elt = content.document.getElementById(id);
     if (elt) {
       let displayStyle = content.window.getComputedStyle(elt).display;
-      if (displayStyle == 'none') {
+      if (displayStyle == "none") {
         result[id] = false;
-      } else if (displayStyle == 'block') {
+      } else if (displayStyle == "block") {
         result[id] = true;
       } else {
         result[id] = "strange: " + displayStyle; // tests should fail!
       }
     } else {
       result[id] = "doesn't exist: " + id;
     }
   }
--- a/browser/base/content/test/general/download_page.html
+++ b/browser/base/content/test/general/download_page.html
@@ -18,26 +18,26 @@ https://bugzilla.mozilla.org/show_bug.cg
         <li><a href="video.ogg"
                 download="just some video" id="link3">Download "just some video"</a></li>
         <li><a href="data:text/plain,test"
                 download="with-target.txt" id="link4">Download "with-target.txt"</a></li>
         <li><a href="javascript:(1+2)+''"
             download="javascript.txt" id="link5">Download "javascript.txt"</a></li>
     </ul>
     <script>
-        var li = document.createElement('li');
-        var a = document.createElement('a');
+        var li = document.createElement("li");
+        var a = document.createElement("a");
 
         a.href = window.URL.createObjectURL(new Blob(["just text"]));
         a.download = "test.blob";
         a.id = "link6";
         a.textContent = 'Download "test.blob"';
 
         li.appendChild(a);
-        document.getElementsByTagName('ul')[0].appendChild(li);
+        document.getElementsByTagName("ul")[0].appendChild(li);
 
         window.addEventListener("beforeunload", function(evt) {
             document.getElementById("unload-flag").textContent = "Fail";
         });
     </script>
     <ul>
         <li><a href="http://example.com/"
                 download="example.com" id="link7" target="_blank">Download "example.com"</a></li>
--- a/browser/base/content/test/general/file_bug822367_1.js
+++ b/browser/base/content/test/general/file_bug822367_1.js
@@ -1,1 +1,1 @@
-document.getElementById('p1').innerHTML = "hello";
+document.getElementById("p1").innerHTML = "hello";
--- a/browser/base/content/test/general/file_bug822367_3.html
+++ b/browser/base/content/test/general/file_bug822367_3.html
@@ -4,17 +4,17 @@
 Test 3 for Mixed Content Blocker User Override - Mixed Script and Display
 https://bugzilla.mozilla.org/show_bug.cgi?id=822367
 -->
 <head>
   <meta charset="utf-8">
   <title>Test 3 for Bug 822367</title>
   <script>
   function foo() {
-    var x = document.createElement('p');
+    var x = document.createElement("p");
     x.setAttribute("id", "p2");
     x.innerHTML = "bye";
     document.getElementById("testContent").appendChild(x);
   }
   </script>
 </head>
 <body>
   <div id="testContent">
--- a/browser/base/content/test/general/file_mixedContentFromOnunload.html
+++ b/browser/base/content/test/general/file_mixedContentFromOnunload.html
@@ -5,14 +5,14 @@ Test for https://bugzilla.mozilla.org/sh
 -->
 <head>
   <meta charset="utf-8">
   <title>Test for Bug 947079</title>
 </head>
 <body>
   <p>Test for Bug 947079</p>
   <script>
-    window.addEventListener('unload', function() {
-        new Image().src = 'http://mochi.test:8888/tests/image/test/mochitest/blue.png';
+    window.addEventListener("unload", function() {
+        new Image().src = "http://mochi.test:8888/tests/image/test/mochitest/blue.png";
     });
   </script>
 </body>
 </html>
--- a/browser/base/content/test/general/head.js
+++ b/browser/base/content/test/general/head.js
@@ -99,17 +99,17 @@ function closeToolbarCustomizationUI(aCa
     aBrowserWin.gNavToolbox.removeEventListener("aftercustomization", unloaded);
     executeSoon(aCallback);
   });
 
   aBrowserWin.gCustomizeMode.exit();
 }
 
 function waitForCondition(condition, nextTest, errorMsg, retryTimes) {
-  retryTimes = typeof retryTimes !== 'undefined' ? retryTimes : 30;
+  retryTimes = typeof retryTimes !== "undefined" ? retryTimes : 30;
   var tries = 0;
   var interval = setInterval(function() {
     if (tries >= retryTimes) {
       ok(false, errorMsg);
       moveOn();
     }
     var conditionPassed;
     try {
--- a/browser/base/content/test/plugins/blocklist_proxy.js
+++ b/browser/base/content/test/plugins/blocklist_proxy.js
@@ -2,17 +2,17 @@ var Cc = Components.classes;
 var Ci = Components.interfaces;
 var Cu = Components.utils;
 var Cm = Components.manager;
 
 const kBlocklistServiceUUID = "{66354bc9-7ed1-4692-ae1d-8da97d6b205e}";
 const kBlocklistServiceContractID = "@mozilla.org/extensions/blocklist;1";
 const kBlocklistServiceFactory = Cm.getClassObject(Cc[kBlocklistServiceContractID], Ci.nsIFactory);
 
-Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 /*
  * A lightweight blocklist proxy for the testing purposes.
  */
 var BlocklistProxy = {
   _uuid: null,
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
--- a/browser/base/content/test/plugins/browser_CTP_outsideScrollArea.js
+++ b/browser/base/content/test/plugins/browser_CTP_outsideScrollArea.js
@@ -33,24 +33,24 @@ add_task(function* () {
 // Test that the click-to-play overlay is not hidden for elements
 // partially or fully outside the viewport.
 
 add_task(function* () {
   yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_outsideScrollArea.html");
 
   yield ContentTask.spawn(gTestBrowser, {}, function* () {
     let doc = content.document;
-    let p = doc.createElement('embed');
+    let p = doc.createElement("embed");
 
-    p.setAttribute('id', 'test');
-    p.setAttribute('type', 'application/x-test');
+    p.setAttribute("id", "test");
+    p.setAttribute("type", "application/x-test");
     p.style.left = "0";
     p.style.bottom = "200px";
 
-    doc.getElementById('container').appendChild(p);
+    doc.getElementById("container").appendChild(p);
   });
 
   // Work around for delayed PluginBindingAttached
   yield promiseUpdatePluginBindings(gTestBrowser);
 
   yield promisePopupNotification("click-to-play-plugins");
 
   yield ContentTask.spawn(gTestBrowser, {}, function* () {
@@ -62,24 +62,24 @@ add_task(function* () {
   });
 });
 
 add_task(function* () {
   yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_outsideScrollArea.html");
 
   yield ContentTask.spawn(gTestBrowser, {}, function* () {
     let doc = content.document;
-    let p = doc.createElement('embed');
+    let p = doc.createElement("embed");
 
-    p.setAttribute('id', 'test');
-    p.setAttribute('type', 'application/x-test');
+    p.setAttribute("id", "test");
+    p.setAttribute("type", "application/x-test");
     p.style.left = "0";
     p.style.bottom = "-410px";
 
-    doc.getElementById('container').appendChild(p);
+    doc.getElementById("container").appendChild(p);
   });
 
   // Work around for delayed PluginBindingAttached
   yield promiseUpdatePluginBindings(gTestBrowser);
 
   yield promisePopupNotification("click-to-play-plugins");
 
   yield ContentTask.spawn(gTestBrowser, null, function* () {
@@ -91,24 +91,24 @@ add_task(function* () {
   });
 });
 
 add_task(function* () {
   yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_outsideScrollArea.html");
 
   yield ContentTask.spawn(gTestBrowser, {}, function* () {
     let doc = content.document;
-    let p = doc.createElement('embed');
+    let p = doc.createElement("embed");
 
-    p.setAttribute('id', 'test');
-    p.setAttribute('type', 'application/x-test');
+    p.setAttribute("id", "test");
+    p.setAttribute("type", "application/x-test");
     p.style.left = "-600px";
     p.style.bottom = "0";
 
-    doc.getElementById('container').appendChild(p);
+    doc.getElementById("container").appendChild(p);
   });
 
   // Work around for delayed PluginBindingAttached
   yield promiseUpdatePluginBindings(gTestBrowser);
 
   yield promisePopupNotification("click-to-play-plugins");
   yield ContentTask.spawn(gTestBrowser, null, function* () {
     let plugin = content.document.getElementById("test");
--- a/browser/base/content/test/plugins/browser_bug787619.js
+++ b/browser/base/content/test/plugins/browser_bug787619.js
@@ -56,10 +56,10 @@ add_task(function* () {
     PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
   PopupNotifications.panel.firstChild._primaryButton.click();
 
   // check plugin state
   pluginInfo = yield promiseForPluginInfo("plugin");
   ok(pluginInfo.activated, "plugin should be activated");
 
-  is(gWrapperClickCount, 0, 'wrapper should not have received any clicks');
+  is(gWrapperClickCount, 0, "wrapper should not have received any clicks");
 });
--- a/browser/base/content/test/plugins/head.js
+++ b/browser/base/content/test/plugins/head.js
@@ -219,17 +219,17 @@ function promiseReloadPlugin(aId, aBrows
 }
 
 // after a test is done using the plugin doorhanger, we should just clear
 // any permissions that may have crept in
 function clearAllPluginPermissions() {
   let perms = Services.perms.enumerator;
   while (perms.hasMoreElements()) {
     let perm = perms.getNext();
-    if (perm.type.startsWith('plugin')) {
+    if (perm.type.startsWith("plugin")) {
       info("removing permission:" + perm.principal.origin + " " + perm.type + "\n");
       Services.perms.removePermission(perm);
     }
   }
 }
 
 function updateBlocklist(aCallback) {
   let blocklistNotifier = Cc["@mozilla.org/extensions/blocklist;1"]
@@ -383,17 +383,17 @@ function promiseForNotificationShown(not
  * there is some sort of plugin in the page.
  * @param browser
  *        The browser to force plugin bindings in.
  * @return Promise
  */
 function promiseUpdatePluginBindings(browser) {
   return ContentTask.spawn(browser, {}, function* () {
     let doc = content.document;
-    let elems = doc.getElementsByTagName('embed');
+    let elems = doc.getElementsByTagName("embed");
     if (!elems || elems.length < 1) {
-      elems = doc.getElementsByTagName('object');
+      elems = doc.getElementsByTagName("object");
     }
     if (elems && elems.length > 0) {
       elems[0].clientTop;
     }
   });
 }
--- a/browser/base/content/test/plugins/plugin_syncRemoved.html
+++ b/browser/base/content/test/plugins/plugin_syncRemoved.html
@@ -1,15 +1,15 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <body>
 <script type="text/javascript">
   // create an embed, insert it in the doc and immediately remove it
-  var embed = document.createElement('embed');
+  var embed = document.createElement("embed");
   embed.setAttribute("id", "test");
   embed.setAttribute("type", "application/x-test");
   embed.setAttribute("style", "width: 0px; height: 0px;");
   document.body.appendChild(embed);
   window.getComputedStyle(embed, null).top;
   document.body.remove(embed);
 </script>
--- a/browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js
+++ b/browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js
@@ -159,17 +159,17 @@ var tests = [
     }
   },
 ];
 
 // Test checkbox disabling the main action in different combinations
 ["checkedState", "uncheckedState"].forEach(function(state) {
   [true, false].forEach(function(checked) {
     tests.push(
-      { id: `checkbox_disableMainAction_${state}_${checked ? 'checked' : 'unchecked'}`,
+      { id: `checkbox_disableMainAction_${state}_${checked ? "checked" : "unchecked"}`,
         run() {
           this.notifyObj = new BasicNotification(this.id);
           this.notifyObj.options.checkbox = {
             label: "This is a checkbox",
             checked,
             [state]: {
               disableMainAction: true,
               warningLabel: "Testing disable",
--- a/browser/base/content/test/referrer/head.js
+++ b/browser/base/content/test/referrer/head.js
@@ -8,17 +8,17 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://testing-common/ContentTask.jsm");
 
 const REFERRER_URL_BASE = "/browser/browser/base/content/test/referrer/";
 const REFERRER_POLICYSERVER_URL =
   "test1.example.com" + REFERRER_URL_BASE + "file_referrer_policyserver.sjs";
 const REFERRER_POLICYSERVER_URL_ATTRIBUTE =
   "test1.example.com" + REFERRER_URL_BASE + "file_referrer_policyserver_attr.sjs";
 
-SpecialPowers.pushPrefEnv({"set": [['network.http.enablePerElementReferrer', true]]});
+SpecialPowers.pushPrefEnv({"set": [["network.http.enablePerElementReferrer", true]]});
 
 var gTestWindow = null;
 var rounds = 0;
 
 // We test that the UI code propagates three pieces of state - the referrer URI
 // itself, the referrer policy, and the triggering principal. After that, we
 // trust nsIWebNavigation to do the right thing with the info it's given, which
 // is covered more exhaustively by dom/base/test/test_bug704320.html (which is
--- a/browser/base/content/test/social/browser_aboutHome_activation.js
+++ b/browser/base/content/test/social/browser_aboutHome_activation.js
@@ -5,58 +5,58 @@
 var SocialService = Cu.import("resource:///modules/SocialService.jsm", {}).SocialService;
 
 XPCOMUtils.defineLazyModuleGetter(this, "Task",
   "resource://gre/modules/Task.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "AboutHomeUtils",
   "resource:///modules/AboutHome.jsm");
 
 var snippet =
-'     <script>' +
-'       var manifest = {' +
+"     <script>" +
+"       var manifest = {" +
 '         "name": "Demo Social Service",' +
 '         "origin": "https://example.com",' +
 '         "iconURL": "chrome://branding/content/icon16.png",' +
 '         "icon32URL": "chrome://branding/content/icon32.png",' +
 '         "icon64URL": "chrome://branding/content/icon64.png",' +
 '         "shareURL": "https://example.com/browser/browser/base/content/test/social/social_share.html",' +
 '         "postActivationURL": "https://example.com/browser/browser/base/content/test/social/social_postActivation.html",' +
-'       };' +
-'       function activateProvider(node) {' +
+"       };" +
+"       function activateProvider(node) {" +
 '         node.setAttribute("data-service", JSON.stringify(manifest));' +
 '         var event = new CustomEvent("ActivateSocialFeature");' +
-'         node.dispatchEvent(event);' +
-'       }' +
-'     </script>' +
+"         node.dispatchEvent(event);" +
+"       }" +
+"     </script>" +
 '     <div id="activationSnippet" onclick="activateProvider(this)">' +
 '     <img src="chrome://branding/content/icon32.png"></img>' +
-'     </div>';
+"     </div>";
 
 // enable one-click activation
 var snippet2 =
-'     <script>' +
-'       var manifest = {' +
+"     <script>" +
+"       var manifest = {" +
 '         "name": "Demo Social Service",' +
 '         "origin": "https://example.com",' +
 '         "iconURL": "chrome://branding/content/icon16.png",' +
 '         "icon32URL": "chrome://branding/content/icon32.png",' +
 '         "icon64URL": "chrome://branding/content/icon64.png",' +
 '         "shareURL": "https://example.com/browser/browser/base/content/test/social/social_share.html",' +
 '         "postActivationURL": "https://example.com/browser/browser/base/content/test/social/social_postActivation.html",' +
 '         "oneclick": true' +
-'       };' +
-'       function activateProvider(node) {' +
+"       };" +
+"       function activateProvider(node) {" +
 '         node.setAttribute("data-service", JSON.stringify(manifest));' +
 '         var event = new CustomEvent("ActivateSocialFeature");' +
-'         node.dispatchEvent(event);' +
-'       }' +
-'     </script>' +
+"         node.dispatchEvent(event);" +
+"       }" +
+"     </script>" +
 '     <div id="activationSnippet" onclick="activateProvider(this)">' +
 '     <img src="chrome://branding/content/icon32.png"></img>' +
-'     </div>';
+"     </div>";
 
 var gTests = [
 
 {
   desc: "Test activation with enable panel",
   snippet,
   panel: true
 },
--- a/browser/base/content/test/social/browser_share.js
+++ b/browser/base/content/test/social/browser_share.js
@@ -32,17 +32,17 @@ function test() {
     /* bug 1042991, ensure history is available by calling history.back on close */
     addMessageListener("closeself", function(e) {
       content.history.back();
       content.close();
     }, true);
     /* if text is entered into field, onbeforeunload will cause a modal dialog
        unless dialogs have been disabled for the iframe. */
     content.onbeforeunload = function(e) {
-      return 'FAIL.';
+      return "FAIL.";
     };
   }.toString() + ")();";
   let mm = getGroupMessageManager("social");
   mm.loadFrameScript(frameScript, true);
 
   // Animation on the panel can cause intermittent failures such as bug 1115131.
   SocialShare.panel.setAttribute("animate", "false");
   registerCleanupFunction(function() {
--- a/browser/base/content/test/social/browser_social_activation.js
+++ b/browser/base/content/test/social/browser_social_activation.js
@@ -236,17 +236,17 @@ var tests = {
       });
     });
   },
 
   testAddonManagerDoubleInstall(next) {
     // Create a new tab and load about:addons
     let addonsTab = gBrowser.addTab();
     gBrowser.selectedTab = addonsTab;
-    BrowserOpenAddonsMgr('addons://list/service');
+    BrowserOpenAddonsMgr("addons://list/service");
     gBrowser.selectedBrowser.addEventListener("load", function tabLoad() {
       gBrowser.selectedBrowser.removeEventListener("load", tabLoad, true);
       is(addonsTab.linkedBrowser.currentURI.spec, "about:addons", "about:addons should load into blank tab.");
 
       activateOneProvider(gProviders[0], true, function() {
         info("first activation completed");
         is(gBrowser.contentDocument.location.href, gProviders[0].origin + "/browser/browser/base/content/test/social/social_postActivation.html", "postActivationURL loaded");
         BrowserTestUtils.removeTab(gBrowser.selectedTab).then(() => {
--- a/browser/base/content/test/social/head.js
+++ b/browser/base/content/test/social/head.js
@@ -59,17 +59,17 @@ function runSocialTestWithProvider(manif
   let SocialService = Cu.import("resource:///modules/SocialService.jsm", {}).SocialService;
 
   let manifests = Array.isArray(manifest) ? manifest : [manifest];
 
   // Check that none of the provider's content ends up in history.
   function* finishCleanUp() {
     for (let i = 0; i < manifests.length; i++) {
       let m = manifests[i];
-      for (let what of ['iconURL', 'shareURL']) {
+      for (let what of ["iconURL", "shareURL"]) {
         if (m[what]) {
           yield promiseSocialUrlNotRemembered(m[what]);
         }
       }
     }
     for (let i = 0; i < gURLsNotRemembered.length; i++) {
       yield promiseSocialUrlNotRemembered(gURLsNotRemembered[i]);
     }
@@ -207,17 +207,17 @@ function setManifestPref(name, manifest)
                createInstance(Ci.nsISupportsString);
   string.data = JSON.stringify(manifest);
   Services.prefs.setComplexValue(name, Ci.nsISupportsString, string);
 }
 
 function getManifestPrefname(aManifest) {
   // is same as the generated name in SocialServiceInternal.getManifestPrefname
   let originUri = Services.io.newURI(aManifest.origin);
-  return "social.manifest." + originUri.hostPort.replace('.', '-');
+  return "social.manifest." + originUri.hostPort.replace(".", "-");
 }
 
 function ensureFrameLoaded(frame, uri) {
   return new Promise(resolve => {
     if (frame.contentDocument && frame.contentDocument.readyState == "complete" &&
         (!uri || frame.contentDocument.location.href == uri)) {
       resolve();
     } else {
@@ -228,39 +228,39 @@ function ensureFrameLoaded(frame, uri) {
         resolve()
       }, true);
     }
   });
 }
 
 // Support for going on and offline.
 // (via browser/base/content/test/browser_bookmark_titles.js)
-var origProxyType = Services.prefs.getIntPref('network.proxy.type');
+var origProxyType = Services.prefs.getIntPref("network.proxy.type");
 
 function toggleOfflineStatus(goOfflineState) {
   // Bug 968887 fix.  when going on/offline, wait for notification before continuing
   return new Promise(resolve => {
     if (!goOfflineState) {
-      Services.prefs.setIntPref('network.proxy.type', origProxyType);
+      Services.prefs.setIntPref("network.proxy.type", origProxyType);
     }
     if (goOfflineState != Services.io.offline) {
       info("initial offline state " + Services.io.offline);
       let expect = !Services.io.offline;
       Services.obs.addObserver(function offlineChange(subject, topic, data) {
         Services.obs.removeObserver(offlineChange, "network:offline-status-changed");
         info("offline state changed to " + Services.io.offline);
         is(expect, Services.io.offline, "network:offline-status-changed successful toggle");
         resolve();
       }, "network:offline-status-changed", false);
       BrowserOffline.toggleOfflineStatus();
     } else {
       resolve();
     }
     if (goOfflineState) {
-      Services.prefs.setIntPref('network.proxy.type', 0);
+      Services.prefs.setIntPref("network.proxy.type", 0);
       // LOAD_FLAGS_BYPASS_CACHE isn't good enough. So clear the cache.
       Services.cache2.clear();
     }
   });
 }
 
 function goOffline() {
   // Simulate a network outage with offline mode. (Localhost is still
--- a/browser/base/content/test/urlbar/browser_bug304198.js
+++ b/browser/base/content/test/urlbar/browser_bug304198.js
@@ -25,61 +25,61 @@ add_task(function* () {
   function cleanUp() {
     gBrowser.removeTab(fullURLTab);
     gBrowser.removeTab(partialURLTab);
     gBrowser.removeTab(deletedURLTab);
   }
 
   function* cycleTabs() {
     yield BrowserTestUtils.switchTab(gBrowser, fullURLTab);
-    is(gURLBar.textValue, testURL, 'gURLBar.textValue should be testURL after switching back to fullURLTab');
+    is(gURLBar.textValue, testURL, "gURLBar.textValue should be testURL after switching back to fullURLTab");
 
     yield BrowserTestUtils.switchTab(gBrowser, partialURLTab);
-    is(gURLBar.textValue, testPartialURL, 'gURLBar.textValue should be testPartialURL after switching back to partialURLTab');
+    is(gURLBar.textValue, testPartialURL, "gURLBar.textValue should be testPartialURL after switching back to partialURLTab");
     yield BrowserTestUtils.switchTab(gBrowser, deletedURLTab);
-    is(gURLBar.textValue, '', 'gURLBar.textValue should be "" after switching back to deletedURLTab');
+    is(gURLBar.textValue, "", 'gURLBar.textValue should be "" after switching back to deletedURLTab');
 
     yield BrowserTestUtils.switchTab(gBrowser, fullURLTab);
-    is(gURLBar.textValue, testURL, 'gURLBar.textValue should be testURL after switching back to fullURLTab');
+    is(gURLBar.textValue, testURL, "gURLBar.textValue should be testURL after switching back to fullURLTab");
   }
 
   function urlbarBackspace() {
     return new Promise((resolve, reject) => {
       gBrowser.selectedBrowser.focus();
       gURLBar.addEventListener("input", function() {
         gURLBar.removeEventListener("input", arguments.callee);
         resolve();
       });
       gURLBar.focus();
       EventUtils.synthesizeKey("VK_BACK_SPACE", {});
     });
   }
 
   function* prepareDeletedURLTab() {
     yield BrowserTestUtils.switchTab(gBrowser, deletedURLTab);
-    is(gURLBar.textValue, testURL, 'gURLBar.textValue should be testURL after initial switch to deletedURLTab');
+    is(gURLBar.textValue, testURL, "gURLBar.textValue should be testURL after initial switch to deletedURLTab");
 
     // simulate the user removing the whole url from the location bar
     gPrefService.setBoolPref("browser.urlbar.clickSelectsAll", true);
 
     yield urlbarBackspace();
     is(gURLBar.textValue, "", 'gURLBar.textValue should be "" (just set)');
     if (gPrefService.prefHasUserValue("browser.urlbar.clickSelectsAll")) {
       gPrefService.clearUserPref("browser.urlbar.clickSelectsAll");
     }
   }
 
   function* prepareFullURLTab() {
     yield BrowserTestUtils.switchTab(gBrowser, fullURLTab);
-    is(gURLBar.textValue, testURL, 'gURLBar.textValue should be testURL after initial switch to fullURLTab');
+    is(gURLBar.textValue, testURL, "gURLBar.textValue should be testURL after initial switch to fullURLTab");
   }
 
   function* preparePartialURLTab() {
     yield BrowserTestUtils.switchTab(gBrowser, partialURLTab);
-    is(gURLBar.textValue, testURL, 'gURLBar.textValue should be testURL after initial switch to partialURLTab');
+    is(gURLBar.textValue, testURL, "gURLBar.textValue should be testURL after initial switch to partialURLTab");
 
     // simulate the user removing part of the url from the location bar
     gPrefService.setBoolPref("browser.urlbar.clickSelectsAll", false);
 
     let deleted = 0;
     while (deleted < charsToDelete) {
       yield urlbarBackspace(arguments.callee);
       deleted++;
--- a/browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
+++ b/browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
@@ -29,17 +29,17 @@ function paste(input, cb) {
     cb();
   }, function() {
     ok(false, "Failed to copy string '" + input + "' to clipboard");
     cb();
   });
 }
 
 function testNext() {
-  gURLBar.value = '';
+  gURLBar.value = "";
   if (!pairs.length) {
     finish();
     return;
   }
 
   let [inputValue, expectedURL] = pairs.shift();
 
   gURLBar.focus();
--- a/browser/base/content/test/urlbar/browser_urlbarDecode.js
+++ b/browser/base/content/test/urlbar/browser_urlbarDecode.js
@@ -3,20 +3,20 @@
 // This test makes sure (1) you can't break the urlbar by typing particular JSON
 // or JS fragments into it, (2) urlbar.textValue shows URLs unescaped, and (3)
 // the urlbar also shows the URLs embedded in action URIs unescaped.  See bug
 // 1233672.
 
 add_task(function* injectJSON() {
   let inputStrs = [
     'http://example.com/ ", "url": "bar',
-    'http://example.com/\\',
+    "http://example.com/\\",
     'http://example.com/"',
     'http://example.com/","url":"evil.com',
-    'http://mozilla.org/\\u0020',
+    "http://mozilla.org/\\u0020",
     'http://www.mozilla.org/","url":1e6,"some-key":"foo',
     'http://www.mozilla.org/","url":null,"some-key":"foo',
     'http://www.mozilla.org/","url":["foo","bar"],"some-key":"foo',
   ];
   for (let inputStr of inputStrs) {
     yield checkInput(inputStr);
   }
   gURLBar.value = "";
--- a/browser/base/content/test/urlbar/browser_urlbar_blanking.js
+++ b/browser/base/content/test/urlbar/browser_urlbar_blanking.js
@@ -13,17 +13,17 @@ add_task(function*() {
 });
 
 add_task(function*() {
   const URI = "http://www.example.com/browser/browser/base/content/test/urlbar/file_blank_but_not_blank.html";
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, URI);
   is(gURLBar.value, URI, "The URL bar should match the URI");
   let browserLoaded = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
   ContentTask.spawn(tab.linkedBrowser, null, function() {
-    content.document.querySelector('a').click();
+    content.document.querySelector("a").click();
   });
   yield browserLoaded;
   ok(gURLBar.value.startsWith("javascript"), "The URL bar should have the JS URI");
   // When reloading, the javascript: uri we're using will throw an exception.
   // That's deliberate, so we need to tell mochitest to ignore it:
   SimpleTest.expectUncaughtException(true);
   yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
     // This is sync, so by the time we return we should have changed the URL bar.
--- a/browser/base/content/test/webrtc/head.js
+++ b/browser/base/content/test/webrtc/head.js
@@ -3,17 +3,17 @@ Components.utils.import("resource:///mod
 
 XPCOMUtils.defineLazyModuleGetter(this, "Promise",
   "resource://gre/modules/Promise.jsm");
 
 const PREF_PERMISSION_FAKE = "media.navigator.permission.fake";
 const CONTENT_SCRIPT_HELPER = getRootDirectory(gTestPath) + "get_user_media_content_script.js";
 
 function waitForCondition(condition, nextTest, errorMsg, retryTimes) {
-  retryTimes = typeof retryTimes !== 'undefined' ? retryTimes : 30;
+  retryTimes = typeof retryTimes !== "undefined" ? retryTimes : 30;
   var tries = 0;
   var interval = setInterval(function() {
     if (tries >= retryTimes) {
       ok(false, errorMsg);
       moveOn();
     }
     var conditionPassed;
     try {
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -200,17 +200,17 @@ function openLinkIn(url, where, params) 
   const Cc = Components.classes;
   const Ci = Components.interfaces;
 
   var aFromChrome           = params.fromChrome;
   var aAllowThirdPartyFixup = params.allowThirdPartyFixup;
   var aPostData             = params.postData;
   var aCharset              = params.charset;
   var aReferrerURI          = params.referrerURI;
-  var aReferrerPolicy       = ('referrerPolicy' in params ?
+  var aReferrerPolicy       = ("referrerPolicy" in params ?
       params.referrerPolicy : Ci.nsIHttpChannel.REFERRER_POLICY_UNSET);
   var aRelatedToCurrent     = params.relatedToCurrent;
   var aAllowMixedContent    = params.allowMixedContent;
   var aInBackground         = params.inBackground;
   var aDisallowInheritPrincipal = params.disallowInheritPrincipal;
   var aInitiatingDoc        = params.initiatingDoc;
   var aIsPrivate            = params.private;
   var aSkipTabAnimation     = params.skipTabAnimation;
--- a/browser/base/content/web-panels.js
+++ b/browser/base/content/web-panels.js
@@ -22,20 +22,20 @@ var panelProgressListener = {
           return;
 
         // ignore local/resource:/chrome: files
         if (aStatus == NS_NET_STATUS_READ_FROM || aStatus == NS_NET_STATUS_WROTE_TO)
            return;
 
         if (aStateFlags & Ci.nsIWebProgressListener.STATE_START &&
             aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK) {
-            window.parent.document.getElementById('sidebar-throbber').setAttribute("loading", "true");
+            window.parent.document.getElementById("sidebar-throbber").setAttribute("loading", "true");
         } else if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
                 aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK) {
-            window.parent.document.getElementById('sidebar-throbber').removeAttribute("loading");
+            window.parent.document.getElementById("sidebar-throbber").removeAttribute("loading");
         }
     }
     ,
 
     onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
         UpdateBackForwardCommands(getPanelBrowser().webNavigation);
     },
 
--- a/browser/components/contextualidentity/test/browser/browser_blobUrl.js
+++ b/browser/components/contextualidentity/test/browser/browser_blobUrl.js
@@ -9,33 +9,33 @@ add_task(function* setup() {
   yield SpecialPowers.pushPrefEnv({"set": [
     ["privacy.userContext.enabled", true]
   ]});
 });
 
 add_task(function* test() {
   info("Creating a tab with UCI = 1...");
   let tab1 = gBrowser.addTab(BASE_URI, {userContextId: 1});
-  is(tab1.getAttribute('usercontextid'), 1, "New tab has UCI equal 1");
+  is(tab1.getAttribute("usercontextid"), 1, "New tab has UCI equal 1");
 
   let browser1 = gBrowser.getBrowserForTab(tab1);
   yield BrowserTestUtils.browserLoaded(browser1);
 
   let blobURL;
 
   info("Creating a blob URL...");
   yield ContentTask.spawn(browser1, null, function() {
     return Promise.resolve(content.window.URL.createObjectURL(new content.window.Blob([123])));
   }).then(newURL => { blobURL = newURL });
 
   info("Blob URL: " + blobURL);
 
   info("Creating a tab with UCI = 2...");
   let tab2 = gBrowser.addTab(BASE_URI, {userContextId: 2});
-  is(tab2.getAttribute('usercontextid'), 2, "New tab has UCI equal 2");
+  is(tab2.getAttribute("usercontextid"), 2, "New tab has UCI equal 2");
 
   let browser2 = gBrowser.getBrowserForTab(tab2);
   yield BrowserTestUtils.browserLoaded(browser2);
 
   yield ContentTask.spawn(browser2, blobURL, function(url) {
     return new Promise(resolve => {
       var xhr = new content.window.XMLHttpRequest();
       xhr.onerror = function() { resolve("SendErrored"); }
@@ -44,17 +44,17 @@ add_task(function* test() {
       xhr.send();
     });
   }).then(status => {
     is(status, "SendErrored", "Using a blob URI from one user context id in another should not work");
   });
 
   info("Creating a tab with UCI = 1...");
   let tab3 = gBrowser.addTab(BASE_URI, {userContextId: 1});
-  is(tab3.getAttribute('usercontextid'), 1, "New tab has UCI equal 1");
+  is(tab3.getAttribute("usercontextid"), 1, "New tab has UCI equal 1");
 
   let browser3 = gBrowser.getBrowserForTab(tab3);
   yield BrowserTestUtils.browserLoaded(browser3);
 
   yield ContentTask.spawn(browser3, blobURL, function(url) {
     return new Promise(resolve => {
       var xhr = new content.window.XMLHttpRequest();
       xhr.open("GET", url);
--- a/browser/components/contextualidentity/test/browser/browser_eme.js
+++ b/browser/components/contextualidentity/test/browser/browser_eme.js
@@ -2,21 +2,21 @@
  * Bug 1283325 - A test case to test the EME is originAttributes aware or not.
  */
 const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu } = Components;
 
 const TEST_HOST = "example.com";
 const TEST_URL = "http://" + TEST_HOST + "/browser/browser/components/contextualidentity/test/browser/";
 
 const TESTKEY = {
-  initDataType: 'keyids',
+  initDataType: "keyids",
   initData: '{"kids":["LwVHf8JLtPrv2GUXFW2v_A"], "type":"persistent-license"}',
   kid: "LwVHf8JLtPrv2GUXFW2v_A",
   key: "97b9ddc459c8d5ff23c1f2754c95abe8",
-  sessionType: 'persistent-license',
+  sessionType: "persistent-license",
 };
 
 const USER_ID_DEFAULT = 0;
 const USER_ID_PERSONAL = 1;
 
 function* openTabInUserContext(uri, userContextId) {
   // Open the tab in the correct userContextId.
   let tab = gBrowser.addTab(uri, {userContextId});
@@ -55,17 +55,17 @@ function ByteArrayToHex(array) {
     res += ("0" + bin.charCodeAt(i).toString(16)).substr(-2);
   }
 
   return res;
 }
 
 function generateKeyObject(aKid, aKey) {
   let keyObj = {
-    kty: 'oct',
+    kty: "oct",
     kid: aKid,
     k: HexToBase64(aKey),
   };
 
   return new TextEncoder().encode(JSON.stringify({
     keys: [keyObj]
   }));
 }
@@ -96,22 +96,22 @@ add_task(function* test() {
   // Open a tab with the default container.
   let defaultContainer = yield openTabInUserContext(TEST_URL + "empty_file.html", USER_ID_DEFAULT);
 
   // Generate the key info for the default container.
   let keyInfo = generateKeyInfo(TESTKEY);
 
   // Update the media key for the default container.
   let result = yield ContentTask.spawn(defaultContainer.browser, keyInfo, function* (aKeyInfo) {
-    let access = yield content.navigator.requestMediaKeySystemAccess('org.w3.clearkey',
+    let access = yield content.navigator.requestMediaKeySystemAccess("org.w3.clearkey",
                                                                      [{
                                                                        initDataTypes: [aKeyInfo.initDataType],
-                                                                       videoCapabilities: [{contentType: 'video/webm'}],
-                                                                       sessionTypes: ['persistent-license'],
-                                                                       persistentState: 'required',
+                                                                       videoCapabilities: [{contentType: "video/webm"}],
+                                                                       sessionTypes: ["persistent-license"],
+                                                                       persistentState: "required",
                                                                      }]);
     let mediaKeys = yield access.createMediaKeys();
     let session = mediaKeys.createSession(aKeyInfo.sessionType);
     let res = {};
 
     // Insert the media key.
     yield new Promise(resolve => {
       session.addEventListener("message", function(event) {
@@ -149,22 +149,22 @@ add_task(function* test() {
 
   // Store the sessionId for the further checking.
   keyInfo.sessionId = result.sessionId;
 
   // Open a tab with personal container.
   let personalContainer = yield openTabInUserContext(TEST_URL + "empty_file.html", USER_ID_PERSONAL);
 
   yield ContentTask.spawn(personalContainer.browser, keyInfo, function* (aKeyInfo) {
-    let access = yield content.navigator.requestMediaKeySystemAccess('org.w3.clearkey',
+    let access = yield content.navigator.requestMediaKeySystemAccess("org.w3.clearkey",
                                                                      [{
                                                                        initDataTypes: [aKeyInfo.initDataType],
-                                                                       videoCapabilities: [{contentType: 'video/webm'}],
-                                                                       sessionTypes: ['persistent-license'],
-                                                                       persistentState: 'required',
+                                                                       videoCapabilities: [{contentType: "video/webm"}],
+                                                                       sessionTypes: ["persistent-license"],
+                                                                       persistentState: "required",
                                                                      }]);
     let mediaKeys = yield access.createMediaKeys();
     let session = mediaKeys.createSession(aKeyInfo.sessionType);
 
     // First, load the session to check that mediakeys do not share with
     // default container.
     yield session.load(aKeyInfo.sessionId);
 
--- a/browser/components/contextualidentity/test/browser/browser_favicon.js
+++ b/browser/components/contextualidentity/test/browser/browser_favicon.js
@@ -79,18 +79,18 @@ add_task(function* setup() {
   // Make sure userContext is enabled.
   yield SpecialPowers.pushPrefEnv({"set": [
     ["privacy.userContext.enabled", true]
   ]});
 
   // Create a http server for the image cache test.
   if (!gHttpServer) {
     gHttpServer = new HttpServer();
-    gHttpServer.registerPathHandler('/', loadIndexHandler);
-    gHttpServer.registerPathHandler('/favicon.png', loadFaviconHandler);
+    gHttpServer.registerPathHandler("/", loadIndexHandler);
+    gHttpServer.registerPathHandler("/favicon.png", loadFaviconHandler);
     gHttpServer.start(-1);
   }
 });
 
 registerCleanupFunction(() => {
   gHttpServer.stop(() => {
     gHttpServer = null;
   });
--- a/browser/components/contextualidentity/test/browser/browser_forgetAPI_EME_forgetThisSite.js
+++ b/browser/components/contextualidentity/test/browser/browser_forgetAPI_EME_forgetThisSite.js
@@ -8,21 +8,21 @@ const TEST_HOST = "example.com";
 const TEST_URL = "http://" + TEST_HOST + "/browser/browser/components/contextualidentity/test/browser/";
 
 const USER_CONTEXTS = [
   "default",
   "personal",
 ];
 
 const TEST_EME_KEY = {
-  initDataType: 'keyids',
+  initDataType: "keyids",
   initData: '{"kids":["LwVHf8JLtPrv2GUXFW2v_A"], "type":"persistent-license"}',
   kid: "LwVHf8JLtPrv2GUXFW2v_A",
   key: "97b9ddc459c8d5ff23c1f2754c95abe8",
-  sessionType: 'persistent-license',
+  sessionType: "persistent-license",
 };
 
 //
 // Support functions.
 //
 
 function* openTabInUserContext(uri, userContextId) {
   // Open the tab in the correct userContextId.
@@ -62,17 +62,17 @@ function ByteArrayToHex(array) {
     res += ("0" + bin.charCodeAt(i).toString(16)).substr(-2);
   }
 
   return res;
 }
 
 function generateKeyObject(aKid, aKey) {
   let keyObj = {
-    kty: 'oct',
+    kty: "oct",
     kid: aKid,
     k: HexToBase64(aKey),
   };
 
   return new TextEncoder().encode(JSON.stringify({
     keys: [keyObj]
   }));
 }
@@ -90,22 +90,22 @@ function generateKeyInfo(aData) {
 
 // Setup a EME key for the given browser, and return the sessionId.
 function* setupEMEKey(browser) {
   // Generate the key info.
   let keyInfo = generateKeyInfo(TEST_EME_KEY);
 
   // Setup the EME key.
   let result = yield ContentTask.spawn(browser, keyInfo, function* (aKeyInfo) {
-    let access = yield content.navigator.requestMediaKeySystemAccess('org.w3.clearkey',
+    let access = yield content.navigator.requestMediaKeySystemAccess("org.w3.clearkey",
                                                                      [{
                                                                        initDataTypes: [aKeyInfo.initDataType],
-                                                                       videoCapabilities: [{contentType: 'video/webm'}],
-                                                                       sessionTypes: ['persistent-license'],
-                                                                       persistentState: 'required',
+                                                                       videoCapabilities: [{contentType: "video/webm"}],
+                                                                       sessionTypes: ["persistent-license"],
+                                                                       persistentState: "required",
                                                                      }]);
     let mediaKeys = yield access.createMediaKeys();
     let session = mediaKeys.createSession(aKeyInfo.sessionType);
     let res = {};
 
     // Insert the EME key.
     yield new Promise(resolve => {
       session.addEventListener("message", function(event) {
@@ -145,22 +145,22 @@ function* setupEMEKey(browser) {
 
 // Check whether the EME key has been cleared.
 function* checkEMEKey(browser, emeSessionId) {
   // Generate the key info.
   let keyInfo = generateKeyInfo(TEST_EME_KEY);
   keyInfo.sessionId = emeSessionId;
 
   yield ContentTask.spawn(browser, keyInfo, function* (aKeyInfo) {
-    let access = yield content.navigator.requestMediaKeySystemAccess('org.w3.clearkey',
+    let access = yield content.navigator.requestMediaKeySystemAccess("org.w3.clearkey",
                                                                      [{
                                                                        initDataTypes: [aKeyInfo.initDataType],
-                                                                       videoCapabilities: [{contentType: 'video/webm'}],
-                                                                       sessionTypes: ['persistent-license'],
-                                                                       persistentState: 'required',
+                                                                       videoCapabilities: [{contentType: "video/webm"}],
+                                                                       sessionTypes: ["persistent-license"],
+                                                                       persistentState: "required",
                                                                      }]);
     let mediaKeys = yield access.createMediaKeys();
     let session = mediaKeys.createSession(aKeyInfo.sessionType);
 
     // First, load the session with the sessionId.
     yield session.load(aKeyInfo.sessionId);
 
     let map = session.keyStatuses;
--- a/browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js
+++ b/browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js
@@ -198,17 +198,17 @@ function* test_cache_cleared() {
 }
 
 // Image Cache
 function* test_image_cache_cleared() {
   let tabs = [];
 
   for (let userContextId of Object.keys(USER_CONTEXTS)) {
     // Open our tab in the given user context to cache image.
-    tabs[userContextId] = yield* openTabInUserContext('http://localhost:' + gHttpServer.identity.primaryPort + '/loadImage.html',
+    tabs[userContextId] = yield* openTabInUserContext("http://localhost:" + gHttpServer.identity.primaryPort + "/loadImage.html",
                                                       userContextId);
     yield BrowserTestUtils.removeTab(tabs[userContextId].tab);
   }
 
   let expectedHits = USER_CONTEXTS.length;
 
   // Check that image cache works with the userContextId.
   is(gHits, expectedHits, "The image should be loaded" + expectedHits + "times.");
@@ -217,17 +217,17 @@ function* test_image_cache_cleared() {
   gHits = 0;
 
   // Forget the site.
   ForgetAboutSite.removeDataFromDomain("localhost:" + gHttpServer.identity.primaryPort + "/");
 
   // Load again.
   for (let userContextId of Object.keys(USER_CONTEXTS)) {
     // Open our tab in the given user context to cache image.
-    tabs[userContextId] = yield* openTabInUserContext('http://localhost:' + gHttpServer.identity.primaryPort + '/loadImage.html',
+    tabs[userContextId] = yield* openTabInUserContext("http://localhost:" + gHttpServer.identity.primaryPort + "/loadImage.html",
                                                       userContextId);
     yield BrowserTestUtils.removeTab(tabs[userContextId].tab);
   }
 
   // Check that image cache was cleared and the server gets another two hits.
   is(gHits, expectedHits, "The image should be loaded" + expectedHits + "times.");
 }
 
@@ -317,18 +317,18 @@ add_task(function* setup() {
   // Make sure userContext is enabled.
   yield SpecialPowers.pushPrefEnv({"set": [
     ["privacy.userContext.enabled", true]
   ]});
 
   // Create a http server for the image cache test.
   if (!gHttpServer) {
     gHttpServer = new HttpServer();
-    gHttpServer.registerPathHandler('/image.png', imageHandler);
-    gHttpServer.registerPathHandler('/loadImage.html', loadImagePageHandler);
+    gHttpServer.registerPathHandler("/image.png", imageHandler);
+    gHttpServer.registerPathHandler("/loadImage.html", loadImagePageHandler);
     gHttpServer.start(-1);
   }
 });
 
 let tests = [
   test_cookie_cleared,
   test_cache_cleared,
   test_image_cache_cleared,
--- a/browser/components/contextualidentity/test/browser/browser_imageCache.js
+++ b/browser/components/contextualidentity/test/browser/browser_imageCache.js
@@ -1,23 +1,23 @@
 let Cu = Components.utils;
 let {HttpServer} = Cu.import("resource://testing-common/httpd.js", {});
 
 const NUM_USER_CONTEXTS = 3;
 
 let gHits = 0;
 
 let server = new HttpServer();
-server.registerPathHandler('/image.png', imageHandler);
-server.registerPathHandler('/file.html', fileHandler);
+server.registerPathHandler("/image.png", imageHandler);
+server.registerPathHandler("/file.html", fileHandler);
 server.start(-1);
 
-let BASE_URI = 'http://localhost:' + server.identity.primaryPort;
-let IMAGE_URI = BASE_URI + '/image.png';
-let FILE_URI = BASE_URI + '/file.html';
+let BASE_URI = "http://localhost:" + server.identity.primaryPort;
+let IMAGE_URI = BASE_URI + "/image.png";
+let FILE_URI = BASE_URI + "/file.html";
 
 function imageHandler(metadata, response) {
   gHits++;
   response.setHeader("Cache-Control", "max-age=10000", false);
   response.setStatusLine(metadata.httpVersion, 200, "OK");
   response.setHeader("Content-Type", "image/png", false);
   var body = "iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAAEUlEQVQImWP4z8AAQTAamQkAhpcI+DeMzFcAAAAASUVORK5CYII=";
   response.bodyOutputStream.write(body, body.length);
--- a/browser/components/contextualidentity/test/browser/browser_middleClick.js
+++ b/browser/components/contextualidentity/test/browser/browser_middleClick.js
@@ -12,17 +12,17 @@ add_task(function* () {
 
   let browser = gBrowser.getBrowserForTab(tab);
   yield BrowserTestUtils.browserLoaded(browser);
 
   info("Create a HTMLAnchorElement...");
   yield ContentTask.spawn(browser, URI,
     function(uri) {
       let anchor = content.document.createElement("a");
-      anchor.setAttribute('id', 'clickMe');
+      anchor.setAttribute("id", "clickMe");
       anchor.setAttribute("href", uri);
       anchor.appendChild(content.document.createTextNode("click me!"));
       content.document.body.appendChild(anchor);
     }
   );
 
   info("Synthesize a mouse click and wait for a new tab...");
   let newTab = yield new Promise((resolve, reject) => {
--- a/browser/components/contextualidentity/test/browser/browser_newtabButton.js
+++ b/browser/components/contextualidentity/test/browser/browser_newtabButton.js
@@ -4,17 +4,17 @@
 // the correct context id is opened
 
 add_task(function* test_menu_with_timeout() {
   yield SpecialPowers.pushPrefEnv({"set": [
       ["privacy.userContext.enabled", true],
       ["privacy.userContext.longPressBehavior", 2]
   ]});
 
-  let newTab = document.getElementById('tabbrowser-tabs');
+  let newTab = document.getElementById("tabbrowser-tabs");
   let newTabButton = document.getAnonymousElementByAttribute(newTab, "anonid", "tabs-newtab-button");
   ok(newTabButton, "New tab button exists");
   ok(!newTabButton.hidden, "New tab button is visible");
   yield BrowserTestUtils.waitForCondition(() => !!document.getAnonymousElementByAttribute(newTab, "anonid", "newtab-popup"), "Wait for popup to exist");
   let popup = document.getAnonymousElementByAttribute(newTab, "anonid", "newtab-popup");
 
   for (let i = 1; i <= 4; i++) {
     let popupShownPromise = BrowserTestUtils.waitForEvent(popup, "popupshown");
@@ -25,28 +25,28 @@ add_task(function* test_menu_with_timeou
 
     ok(contextIdItem, `User context id ${i} exists`);
 
     let waitForTabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
     EventUtils.synthesizeMouseAtCenter(contextIdItem, {});
 
     let tab = yield waitForTabPromise;
 
-    is(tab.getAttribute('usercontextid'), i, `New tab has UCI equal ${i}`);
+    is(tab.getAttribute("usercontextid"), i, `New tab has UCI equal ${i}`);
     yield BrowserTestUtils.removeTab(tab);
   }
 });
 
 add_task(function* test_menu_without_timeout() {
   yield SpecialPowers.pushPrefEnv({"set": [
       ["privacy.userContext.enabled", true],
       ["privacy.userContext.longPressBehavior", 1]
   ]});
 
-  let newTab = document.getElementById('tabbrowser-tabs');
+  let newTab = document.getElementById("tabbrowser-tabs");
   let newTabButton = document.getAnonymousElementByAttribute(newTab, "anonid", "tabs-newtab-button");
   ok(newTabButton, "New tab button exists");
   ok(!newTabButton.hidden, "New tab button is visible");
   yield BrowserTestUtils.waitForCondition(() => !!document.getAnonymousElementByAttribute(newTab, "anonid", "newtab-popup"), "Wait for popup to exist");
   let popup = document.getAnonymousElementByAttribute(newTab, "anonid", "newtab-popup");
 
   for (let i = 1; i <= 4; i++) {
     let popupShownPromise = BrowserTestUtils.waitForEvent(popup, "popupshown");
@@ -57,28 +57,28 @@ add_task(function* test_menu_without_tim
 
     ok(contextIdItem, `User context id ${i} exists`);
 
     let waitForTabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
     EventUtils.synthesizeMouseAtCenter(contextIdItem, {});
 
     let tab = yield waitForTabPromise;
 
-    is(tab.getAttribute('usercontextid'), i, `New tab has UCI equal ${i}`);
+    is(tab.getAttribute("usercontextid"), i, `New tab has UCI equal ${i}`);
     yield BrowserTestUtils.removeTab(tab);
   }
 });
 
 add_task(function* test_no_menu() {
   yield SpecialPowers.pushPrefEnv({"set": [
       ["privacy.userContext.enabled", true],
       ["privacy.userContext.longPressBehavior", 0]
   ]});
 
-  let newTab = document.getElementById('tabbrowser-tabs');
+  let newTab = document.getElementById("tabbrowser-tabs");
   let newTabButton = document.getAnonymousElementByAttribute(newTab, "anonid", "tabs-newtab-button");
   ok(newTabButton, "New tab button exists");
   ok(!newTabButton.hidden, "New tab button is visible");
   let popup = document.getAnonymousElementByAttribute(newTab, "anonid", "newtab-popup");
   ok(!popup, "new tab should not have a popup");
 });
 
 add_task(function* test_private_mode() {
--- a/browser/components/contextualidentity/test/browser/browser_relatedTab.js
+++ b/browser/components/contextualidentity/test/browser/browser_relatedTab.js
@@ -4,28 +4,28 @@
  * Bug 1325014 - Adding tab related to current tab inherits current tab's container usercontextid unless otherwise specified
  */
 
 add_task(function* () {
   let tab = gBrowser.addTab("about:blank", {userContextId: 1});
 
   gBrowser.selectedTab = tab;
   let relatedTab = gBrowser.addTab("about:blank", {relatedToCurrent: true});
-  is(relatedTab.getAttribute('usercontextid'), 1, "Related tab (relatedToCurrent) inherits current tab's usercontextid");
+  is(relatedTab.getAttribute("usercontextid"), 1, "Related tab (relatedToCurrent) inherits current tab's usercontextid");
   yield BrowserTestUtils.removeTab(relatedTab);
 
   gBrowser.selectedTab = tab;
   relatedTab = gBrowser.addTab("about:blank", {relatedToCurrent: true, userContextId: 2});
-  is(relatedTab.getAttribute('usercontextid'), 2, "Related tab (relatedToCurrent) with overridden usercontextid");
+  is(relatedTab.getAttribute("usercontextid"), 2, "Related tab (relatedToCurrent) with overridden usercontextid");
   yield BrowserTestUtils.removeTab(relatedTab);
 
   gBrowser.selectedTab = tab;
   relatedTab = gBrowser.addTab("about:blank", {referrerURI: gBrowser.currentURI});
-  is(relatedTab.getAttribute('usercontextid'), 1, "Related tab (referrer) inherits current tab's usercontextid");
+  is(relatedTab.getAttribute("usercontextid"), 1, "Related tab (referrer) inherits current tab's usercontextid");
   yield BrowserTestUtils.removeTab(relatedTab);
 
   gBrowser.selectedTab = tab;
   relatedTab = gBrowser.addTab("about:blank", {referrerURI: gBrowser.currentURI, userContextId: 2});
-  is(relatedTab.getAttribute('usercontextid'), 2, "Related tab (referrer) with overridden usercontextid");
+  is(relatedTab.getAttribute("usercontextid"), 2, "Related tab (referrer) with overridden usercontextid");
   yield BrowserTestUtils.removeTab(relatedTab);
 
   yield BrowserTestUtils.removeTab(tab);
 });
--- a/browser/components/contextualidentity/test/browser/browser_windowName.js
+++ b/browser/components/contextualidentity/test/browser/browser_windowName.js
@@ -16,51 +16,51 @@ add_task(function* setup() {
   yield SpecialPowers.pushPrefEnv({"set": [
     ["privacy.userContext.enabled", true],
     ["browser.link.open_newwindow", 3],
   ]});
 });
 
 add_task(function* test() {
   info("Creating first tab...");
-  let tab1 = gBrowser.addTab(BASE_URI + '?old', {userContextId: 1});
+  let tab1 = gBrowser.addTab(BASE_URI + "?old", {userContextId: 1});
   let browser1 = gBrowser.getBrowserForTab(tab1);
   yield BrowserTestUtils.browserLoaded(browser1);
   yield ContentTask.spawn(browser1, null, function(opts) {
-    content.window.name = 'tab-1';
+    content.window.name = "tab-1";
   });
 
   info("Creating second tab...");
-  let tab2 = gBrowser.addTab(BASE_URI + '?old', {userContextId: 2});
+  let tab2 = gBrowser.addTab(BASE_URI + "?old", {userContextId: 2});
   let browser2 = gBrowser.getBrowserForTab(tab2);
   yield BrowserTestUtils.browserLoaded(browser2);
   yield ContentTask.spawn(browser2, null, function(opts) {
-    content.window.name = 'tab-2';
+    content.window.name = "tab-2";
   });
 
   // Let's try to open a window from tab1 with a name 'tab-2'.
   info("Opening a window from the first tab...");
-  yield ContentTask.spawn(browser1, { url: BASE_URI + '?new' }, function* (opts) {
+  yield ContentTask.spawn(browser1, { url: BASE_URI + "?new" }, function* (opts) {
     yield (new content.window.wrappedJSObject.Promise(resolve => {
-      let w = content.window.wrappedJSObject.open(opts.url, 'tab-2');
+      let w = content.window.wrappedJSObject.open(opts.url, "tab-2");
       w.onload = function() { resolve(); }
     }));
   });
 
-  is(browser1.contentTitle, '?old', "Tab1 title must be 'old'");
+  is(browser1.contentTitle, "?old", "Tab1 title must be 'old'");
   is(browser1.contentPrincipal.userContextId, 1, "Tab1 UCI must be 1");
 
-  is(browser2.contentTitle, '?old', "Tab2 title must be 'old'");
+  is(browser2.contentTitle, "?old", "Tab2 title must be 'old'");
   is(browser2.contentPrincipal.userContextId, 2, "Tab2 UCI must be 2");
 
   let found = false;
   for (let i = 0; i < gBrowser.tabContainer.childNodes.length; ++i) {
     let tab = gBrowser.tabContainer.childNodes[i];
     let browser = gBrowser.getBrowserForTab(tab);
-    if (browser.contentTitle == '?new') {
+    if (browser.contentTitle == "?new") {
       is(browser.contentPrincipal.userContextId, 1, "Tab3 UCI must be 1");
       isnot(browser, browser1, "Tab3 is not browser 1");
       isnot(browser, browser2, "Tab3 is not browser 2");
       gBrowser.removeTab(tab);
       found = true;
       break;
     }
   }
--- a/browser/components/contextualidentity/test/browser/browser_windowOpen.js
+++ b/browser/components/contextualidentity/test/browser/browser_windowOpen.js
@@ -12,28 +12,28 @@ add_task(function* setup() {
     ["browser.link.open_newwindow", 2],
   ]});
 });
 
 
 add_task(function* test() {
   info("Creating a tab with UCI = 1...");
   let tab = gBrowser.addTab(BASE_URI, {userContextId: 1});
-  is(tab.getAttribute('usercontextid'), 1, "New tab has UCI equal 1");
+  is(tab.getAttribute("usercontextid"), 1, "New tab has UCI equal 1");
 
   let browser = gBrowser.getBrowserForTab(tab);
   yield BrowserTestUtils.browserLoaded(browser);
 
   info("Opening a new window from this tab...");
   ContentTask.spawn(browser, BASE_URI, function(url) {
     content.window.newWindow = content.window.open(url, "_blank");
   });
 
   let newWin = yield BrowserTestUtils.waitForNewWindow();
   let newTab = newWin.gBrowser.selectedTab;
 
   yield BrowserTestUtils.browserLoaded(newTab.linkedBrowser);
-  is(newTab.getAttribute('usercontextid'), 1, "New tab has UCI equal 1");
+  is(newTab.getAttribute("usercontextid"), 1, "New tab has UCI equal 1");
 
   info("Closing the new window and tab...");
   yield BrowserTestUtils.closeWindow(newWin);
   yield BrowserTestUtils.removeTab(tab);
 });
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -613,17 +613,17 @@ var CustomizableUIInternal = {
           gPendingBuildAreas.set(area, new Map());
         }
         let pendingNodes = gPendingBuildAreas.get(area);
         pendingNodes.set(aToolbar, aExistingChildren);
         return;
       }
       let props = {type: CustomizableUI.TYPE_TOOLBAR, legacy: true};
       let defaultsetAttribute = aToolbar.getAttribute("defaultset") || "";
-      props.defaultPlacements = defaultsetAttribute.split(',').filter(s => s);
+      props.defaultPlacements = defaultsetAttribute.split(",").filter(s => s);
       this.registerArea(area, props);
       areaProperties = gAreas.get(area);
     }
 
     this.beginBatchUpdate();
     try {
       let placements = gPlacements.get(area);
       if (!placements && areaProperties.has("legacy")) {
@@ -976,17 +976,17 @@ var CustomizableUIInternal = {
       if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
         container.removeChild(widgetNode);
       } else {
         areaNode.toolbox.palette.appendChild(widgetNode);
       }
       this.notifyListeners("onWidgetAfterDOMChange", widgetNode, null, container, true);
 
       if (isToolbar) {
-        areaNode.setAttribute("currentset", gPlacements.get(aArea).join(','));
+        areaNode.setAttribute("currentset", gPlacements.get(aArea).join(","));
       }
 
       let windowCache = gSingleWrapperCache.get(window);
       if (windowCache) {
         windowCache.delete(aWidgetId);
       }
     }
     if (!gResetting) {
@@ -1148,17 +1148,17 @@ var CustomizableUIInternal = {
         widgetNode.setAttribute("wrap", "true");
       }
     }
 
     let [insertionContainer, nextNode] = this.findInsertionPoints(widgetNode, aAreaNode);
     this.insertWidgetBefore(widgetNode, nextNode, insertionContainer, areaId);
 
     if (gAreas.get(areaId).get("type") == CustomizableUI.TYPE_TOOLBAR) {
-      aAreaNode.setAttribute("currentset", gPlacements.get(areaId).join(','));
+      aAreaNode.setAttribute("currentset", gPlacements.get(areaId).join(","));
     }
   },
 
   findInsertionPoints(aNode, aAreaNode) {
     let areaId = aAreaNode.id;
     let props = gAreas.get(areaId);
 
     // For overflowable toolbars, rely on them (because the work is more complicated):
@@ -2727,17 +2727,17 @@ var CustomizableUIInternal = {
           let isRemovable = this.isWidgetRemovable(itemNodeOrItem);
           let isInDefault = defaultPlacements.indexOf(item) != -1;
           return isRemovable || isInDefault;
         };
         // Toolbars have a currentSet property which also deals correctly with overflown
         // widgets (if any) - use that instead:
         if (props.get("type") == CustomizableUI.TYPE_TOOLBAR) {
           let currentSet = container.currentSet;
-          currentPlacements = currentSet ? currentSet.split(',') : [];
+          currentPlacements = currentSet ? currentSet.split(",") : [];
           currentPlacements = currentPlacements.filter(removableOrDefault);
         } else {
           // Clone the array so we don't modify the actual placements...
           currentPlacements = [...currentPlacements];
           currentPlacements = currentPlacements.filter((item) => {
             let itemNode = container.getElementsByAttribute("id", item)[0];
             return itemNode && removableOrDefault(itemNode || item);
           });
@@ -4115,17 +4115,17 @@ OverflowableToolbar.prototype = {
   show() {
     if (this._panel.state == "open") {
       return Promise.resolve();
     }
     return new Promise(resolve => {
       let doc = this._panel.ownerDocument;
       this._panel.hidden = false;
       let contextMenu = doc.getElementById(this._panel.getAttribute("context"));
-      gELS.addSystemEventListener(contextMenu, 'command', this, true);
+      gELS.addSystemEventListener(contextMenu, "command", this, true);
       let anchor = doc.getAnonymousElementByAttribute(this._chevron, "class", "toolbarbutton-icon");
       this._panel.openPopup(anchor || this._chevron);
       this._chevron.open = true;
 
       let overflowableToolbarInstance = this;
       this._panel.addEventListener("popupshown", function onPopupShown(aEvent) {
         this.removeEventListener("popupshown", onPopupShown);
         this.addEventListener("dragover", overflowableToolbarInstance);
@@ -4145,17 +4145,17 @@ OverflowableToolbar.prototype = {
   },
 
   _onPanelHiding(aEvent) {
     this._chevron.open = false;
     this._panel.removeEventListener("dragover", this);
     this._panel.removeEventListener("dragend", this);
     let doc = aEvent.target.ownerDocument;
     let contextMenu = doc.getElementById(this._panel.getAttribute("context"));
-    gELS.removeSystemEventListener(contextMenu, 'command', this, true);
+    gELS.removeSystemEventListener(contextMenu, "command", this, true);
   },
 
   onOverflow(aEvent) {
     // The rangeParent check is here because of bug 1111986 and ensuring that
     // overflow events from the bookmarks toolbar items or similar things that
     // manage their own overflow don't trigger an overflow on the entire toolbar
     if (!this._enabled ||
         (aEvent && aEvent.target != this._toolbar.customizationTarget) ||
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -1324,17 +1324,17 @@ CustomizeMode.prototype = {
       this._removeDragHandlers(aContainer);
       DragPositionManager.remove(this.window, aArea, aContainer);
       this.areas.delete(aContainer);
     }
   },
 
   openAddonsManagerThemes(aEvent) {
     aEvent.target.parentNode.parentNode.hidePopup();
-    this.window.BrowserOpenAddonsMgr('addons://list/theme');
+    this.window.BrowserOpenAddonsMgr("addons://list/theme");
   },
 
   getMoreThemes(aEvent) {
     aEvent.target.parentNode.parentNode.hidePopup();
     let getMoreURL = Services.urlFormatter.formatURLPref("lightweightThemes.getMoreURL");
     this.window.openUILinkIn(getMoreURL, "tab");
   },
 
@@ -2025,17 +2025,17 @@ CustomizeMode.prototype = {
         } else {
           // otherwise:
           prop = "borderRightWidth";
           otherProp = "border-left-width";
         }
         if (makeSpaceImmediately) {
           aItem.setAttribute("notransition", "true");
         }
-        aItem.style[prop] = width + 'px';
+        aItem.style[prop] = width + "px";
         aItem.style.removeProperty(otherProp);
         if (makeSpaceImmediately) {
           // Force a layout flush:
           aItem.getBoundingClientRect();
           aItem.removeAttribute("notransition");
         }
       }
     }
--- a/browser/components/customizableui/content/toolbar.xml
+++ b/browser/components/customizableui/content/toolbar.xml
@@ -192,21 +192,21 @@
             for (let node of overflowList.children) {
               let realNode = node.localName == "toolbarpaletteitem" ? node.firstChild : node;
               if (realNode.getAttribute("skipintoolbarset") != "true") {
                 currentWidgets.add(realNode.id);
               }
             }
           }
           let orderedPlacements = CustomizableUI.getWidgetIdsInArea(this.id);
-          return orderedPlacements.filter((x) => currentWidgets.has(x)).join(',');
+          return orderedPlacements.filter((x) => currentWidgets.has(x)).join(",");
         ]]></getter>
         <setter><![CDATA[
           // Get list of new and old ids:
-          let newVal = (val || '').split(',').filter(x => x);
+          let newVal = (val || "").split(",").filter(x => x);
           let oldIds = CustomizableUI.getWidgetIdsInArea(this.id);
 
           // Get a list of items only in the new list
           let newIds = newVal.filter(id => oldIds.indexOf(id) == -1);
           CustomizableUI.beginBatchUpdate();
           try {
             for (let newId of newIds) {
               oldIds = CustomizableUI.getWidgetIdsInArea(this.id);
@@ -220,17 +220,17 @@
                 // If it's not in the old list, repeat:
               } while (pos == -1 && nextId);
               if (pos == -1) {
                 pos = null; // We didn't find anything, insert at the end
               }
               CustomizableUI.addWidgetToArea(newId, this.id, pos);
             }
 
-            let currentIds = this.currentSet.split(',');
+            let currentIds = this.currentSet.split(",");
             let removedIds = currentIds.filter(id => newIds.indexOf(id) == -1 && newVal.indexOf(id) == -1);
             for (let removedId of removedIds) {
               CustomizableUI.removeWidgetFromArea(removedId);
             }
           } finally {
             CustomizableUI.endBatchUpdate();
           }
         ]]></setter>
@@ -436,17 +436,17 @@
               // out if the user has customized things / we've been here before:
               if (!this._whiteListed.has(node.id)) {
                 node.setAttribute("removable", "true");
               }
               children.push(node);
             }
           }
           CustomizableUI.registerToolbarNode(this, children);
-          let existingMigratedItems = (this.getAttribute("migratedset") || "").split(',');
+          let existingMigratedItems = (this.getAttribute("migratedset") || "").split(",");
           for (let migratedItem of existingMigratedItems.filter((x) => !!x)) {
             this._currentSetMigrated.add(migratedItem);
           }
           this.evictNodes();
           // We can't easily use |this| or strong bindings for the observer fn here
           // because that creates leaky circular references when the node goes away,
           // and XBL destructors are unreliable.
           let mutationObserver = new MutationObserver(function(mutations) {
@@ -567,34 +567,34 @@
       </method>
       <method name="getMigratedItems">
         <body><![CDATA[
           return [...this._currentSetMigrated];
         ]]></body>
       </method>
       <method name="_updateMigratedSet">
         <body><![CDATA[
-          let newMigratedItems = this.getMigratedItems().join(',');
+          let newMigratedItems = this.getMigratedItems().join(",");
           if (this.getAttribute("migratedset") != newMigratedItems) {
             this.setAttribute("migratedset", newMigratedItems);
             this.ownerDocument.persist(this.id, "migratedset");
           }
         ]]></body>
       </method>
       <property name="customizationTarget" readonly="true">
         <getter><![CDATA[
           return this;
         ]]></getter>
       </property>
       <property name="currentSet">
         <getter><![CDATA[
           return Array.from(this.children, node => node.id).join(",");
         ]]></getter>
         <setter><![CDATA[
-          let v = val.split(',');
+          let v = val.split(",");
           let newButtons = v.filter(x => x && (!this._whiteListed.has(x) &&
                                                !CustomizableUI.isSpecialWidget(x) &&
                                                !this._currentSetMigrated.has(x)));
           for (let newButton of newButtons) {
             this._currentSetMigrated.add(newButton);
             this.insertItem(newButton);
           }
           this._updateMigratedSet();
--- a/browser/components/customizableui/test/browser_1161838_inserted_new_default_buttons.js
+++ b/browser/components/customizableui/test/browser_1161838_inserted_new_default_buttons.js
@@ -50,17 +50,17 @@ function test() {
   let futureNavbarPlacements = gFuturePlacements.get(CustomizableUI.AREA_NAVBAR);
   ok(futureNavbarPlacements, "Should have placements for nav-bar");
   if (futureNavbarPlacements) {
     ok(futureNavbarPlacements.has(testWidgetNew.id), "widget should be in future placements");
   }
   CustomizableUIInternal._placeNewDefaultWidgetsInArea(CustomizableUI.AREA_NAVBAR);
 
   let indexInSavedPlacements = savedPlacements.indexOf(testWidgetNew.id);
-  info("Saved placements: " + savedPlacements.join(', '));
+  info("Saved placements: " + savedPlacements.join(", "));
   isnot(indexInSavedPlacements, -1, "Widget should have been inserted");
   is(indexInSavedPlacements, savedPlacements.indexOf("bookmarks-menu-button") + 1,
      "Widget should be in the right place.");
 
   if (futureNavbarPlacements) {
     ok(!futureNavbarPlacements.has(testWidgetNew.id), "widget should be out of future placements");
   }
 
--- a/browser/components/customizableui/test/browser_876926_customize_mode_wrapping.js
+++ b/browser/components/customizableui/test/browser_876926_customize_mode_wrapping.js
@@ -50,27 +50,27 @@ function isLast(containerId, defaultPlac
      "Widget " + id + " should be in " + containerId + " in customizing window.");
   is(otherWin.document.getElementById(containerId).customizationTarget.lastChild.id, id,
      "Widget " + id + " should be in " + containerId + " in other window.");
 }
 
 function getLastVisibleNodeInToolbar(containerId, win = window) {
   let container = win.document.getElementById(containerId).customizationTarget;
   let rv = container.lastChild;
-  while (rv && (rv.getAttribute('hidden') == 'true' || (rv.firstChild && rv.firstChild.getAttribute('hidden') == 'true'))) {
+  while (rv && (rv.getAttribute("hidden") == "true" || (rv.firstChild && rv.firstChild.getAttribute("hidden") == "true"))) {
     rv = rv.previousSibling;
   }
   return rv;
 }
 
 function isLastVisibleInToolbar(containerId, defaultPlacements, id) {
   let newPlacements;
   for (let i = defaultPlacements.length - 1; i >= 0; i--) {
     let el = document.getElementById(defaultPlacements[i]);
-    if (el && el.getAttribute('hidden') != 'true') {
+    if (el && el.getAttribute("hidden") != "true") {
       newPlacements = [...defaultPlacements];
       newPlacements.splice(i + 1, 0, id);
       break;
     }
   }
   if (!newPlacements) {
     assertAreaPlacements(containerId, defaultPlacements.concat([id]));
   } else {
--- a/browser/components/customizableui/test/browser_876944_customize_mode_create_destroy.js
+++ b/browser/components/customizableui/test/browser_876944_customize_mode_create_destroy.js
@@ -5,17 +5,17 @@
 "use strict";
 
 const kTestWidget1 = "test-customize-mode-create-destroy1";
 const kTestWidget2 = "test-customize-mode-create-destroy2";
 
 // Creating and destroying a widget should correctly wrap/unwrap stuff
 add_task(function* testWrapUnwrap() {
   yield startCustomizing();
-  CustomizableUI.createWidget({id: kTestWidget1, label: 'Pretty label', tooltiptext: 'Pretty tooltip'});
+  CustomizableUI.createWidget({id: kTestWidget1, label: "Pretty label", tooltiptext: "Pretty tooltip"});
   let elem = document.getElementById(kTestWidget1);
   let wrapper = document.getElementById("wrapper-" + kTestWidget1);
   ok(elem, "There should be an item");
   ok(wrapper, "There should be a wrapper");
   is(wrapper.firstChild.id, kTestWidget1, "Wrapper should have test widget");
   is(wrapper.parentNode.id, "customization-palette", "Wrapper should be in palette");
   CustomizableUI.destroyWidget(kTestWidget1);
   wrapper = document.getElementById("wrapper-" + kTestWidget1);
@@ -27,17 +27,17 @@ add_task(function* testWrapUnwrap() {
 // Creating and destroying a widget should correctly deal with panel placeholders
 add_task(function* testPanelPlaceholders() {
   let panel = document.getElementById(CustomizableUI.AREA_PANEL);
   // The value of expectedPlaceholders depends on the default palette layout.
   // Bug 1229236 is for these tests to be smarter so the test doesn't need to
   // change when the default placements change.
   let expectedPlaceholders = 1 + (isInDevEdition() ? 1 : 0);
   is(panel.querySelectorAll(".panel-customization-placeholder").length, expectedPlaceholders, "The number of placeholders should be correct.");
-  CustomizableUI.createWidget({id: kTestWidget2, label: 'Pretty label', tooltiptext: 'Pretty tooltip', defaultArea: CustomizableUI.AREA_PANEL});
+  CustomizableUI.createWidget({id: kTestWidget2, label: "Pretty label", tooltiptext: "Pretty tooltip", defaultArea: CustomizableUI.AREA_PANEL});
   let elem = document.getElementById(kTestWidget2);
   let wrapper = document.getElementById("wrapper-" + kTestWidget2);
   ok(elem, "There should be an item");
   ok(wrapper, "There should be a wrapper");
   is(wrapper.firstChild.id, kTestWidget2, "Wrapper should have test widget");
   is(wrapper.parentNode, panel, "Wrapper should be in panel");
   expectedPlaceholders = isInDevEdition() ? 1 : 3;
   is(panel.querySelectorAll(".panel-customization-placeholder").length, expectedPlaceholders, "The number of placeholders should be correct.");
--- a/browser/components/customizableui/test/browser_877006_missing_view.js
+++ b/browser/components/customizableui/test/browser_877006_missing_view.js
@@ -1,21 +1,21 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 // Should be able to add broken view widget
 add_task(function testAddbrokenViewWidget() {
-  const kWidgetId = 'test-877006-broken-widget';
+  const kWidgetId = "test-877006-broken-widget";
   let widgetSpec = {
     id: kWidgetId,
-    type: 'view',
-    viewId: 'idontexist',
+    type: "view",
+    viewId: "idontexist",
     /* Empty handler so we try to attach it maybe? */
     onViewShowing() {
     }
   };
 
   let noError = true;
   try {
     CustomizableUI.createWidget(widgetSpec);
--- a/browser/components/customizableui/test/browser_887438_currentset_shim.js
+++ b/browser/components/customizableui/test/browser_887438_currentset_shim.js
@@ -17,24 +17,24 @@ add_task(function() {
     }
   }
   for (let node of overflowPanelList.childNodes) {
     if (node.getAttribute("skipintoolbarset") != "true") {
       nodeIds.push(node.id);
     }
   }
   let currentSet = navbar.currentSet;
-  is(currentSet.split(',').length, nodeIds.length, "Should be just as many nodes as there are.");
-  is(currentSet, nodeIds.join(','), "Current set and node IDs should match.");
+  is(currentSet.split(",").length, nodeIds.length, "Should be just as many nodes as there are.");
+  is(currentSet, nodeIds.join(","), "Current set and node IDs should match.");
 });
 
 // Insert, then remove items
 add_task(function() {
   let currentSet = navbar.currentSet;
-  let newCurrentSet = currentSet.replace('home-button', 'feed-button,sync-button,home-button');
+  let newCurrentSet = currentSet.replace("home-button", "feed-button,sync-button,home-button");
   navbar.currentSet = newCurrentSet;
   is(newCurrentSet, navbar.currentSet, "Current set should match expected current set.");
   let feedBtn = document.getElementById("feed-button");
   let syncBtn = document.getElementById("sync-button");
   ok(feedBtn, "Feed button should have been added.");
   ok(syncBtn, "Sync button should have been added.");
   if (feedBtn && syncBtn) {
     let feedParent = feedBtn.parentNode;
@@ -49,17 +49,17 @@ add_task(function() {
   }
   navbar.currentSet = currentSet;
   is(currentSet, navbar.currentSet, "Should be able to remove the added items.");
 });
 
 // Simultaneous insert/remove:
 add_task(function() {
   let currentSet = navbar.currentSet;
-  let newCurrentSet = currentSet.replace('home-button', 'feed-button');
+  let newCurrentSet = currentSet.replace("home-button", "feed-button");
   navbar.currentSet = newCurrentSet;
   is(newCurrentSet, navbar.currentSet, "Current set should match expected current set.");
   let feedBtn = document.getElementById("feed-button");
   ok(feedBtn, "Feed button should have been added.");
   let homeBtn = document.getElementById("home-button");
   ok(!homeBtn, "Home button should have been removed.");
   if (feedBtn) {
     let feedParent = feedBtn.parentNode;
--- a/browser/components/customizableui/test/browser_942581_unregisterArea_keeps_placements.js
+++ b/browser/components/customizableui/test/browser_942581_unregisterArea_keeps_placements.js
@@ -10,17 +10,17 @@ const kTestWidgetCount = 3;
 registerCleanupFunction(removeCustomToolbars);
 
 // unregisterArea should keep placements by default and restore them when re-adding the area
 add_task(function*() {
   let widgetIds = [];
   for (let i = 0; i < kTestWidgetCount; i++) {
     let id = kTestWidgetPfx + i;
     widgetIds.push(id);
-    let spec = {id, type: 'button', removable: true, label: "unregisterArea test", tooltiptext: "" + i};
+    let spec = {id, type: "button", removable: true, label: "unregisterArea test", tooltiptext: "" + i};
     CustomizableUI.createWidget(spec);
   }
   for (let i = kTestWidgetCount; i < kTestWidgetCount * 2; i++) {
     let id = kTestWidgetPfx + i;
     widgetIds.push(id);
     createDummyXULButton(id, "unregisterArea XUL test " + i);
   }
   let toolbarNode = createToolbarWithPlacements(kToolbarName, widgetIds);
--- a/browser/components/customizableui/test/browser_952963_areaType_getter_no_area.js
+++ b/browser/components/customizableui/test/browser_952963_areaType_getter_no_area.js
@@ -27,17 +27,17 @@ add_task(function*() {
   toolbarNode.remove();
 
   let w = CustomizableUI.getWidget(kUnregisterAreaTestWidget);
   checkAreaType(w);
 
   w = CustomizableUI.getWidget(kTestWidget);
   checkAreaType(w);
 
-  let spec = {id: kUnregisterAreaTestWidget, type: 'button', removable: true,
+  let spec = {id: kUnregisterAreaTestWidget, type: "button", removable: true,
               label: "areaType test", tooltiptext: "areaType test"};
   CustomizableUI.createWidget(spec);
   toolbarNode = createToolbarWithPlacements(kToolbarName, [kUnregisterAreaTestWidget]);
   CustomizableUI.unregisterArea(kToolbarName);
   toolbarNode.remove();
   w = CustomizableUI.getWidget(spec.id);
   checkAreaType(w);
   CustomizableUI.removeWidgetFromArea(kUnregisterAreaTestWidget);
--- a/browser/components/customizableui/test/browser_956602_remove_special_widget.js
+++ b/browser/components/customizableui/test/browser_956602_remove_special_widget.js
@@ -6,17 +6,17 @@
 
 
 // Adding a separator and then dragging it out of the navbar shouldn't throw
 add_task(function*() {
   try {
     let navbar = document.getElementById("nav-bar");
     let separatorSelector = "toolbarseparator[id^=customizableui-special-separator]";
     ok(!navbar.querySelector(separatorSelector), "Shouldn't be a separator in the navbar");
-    CustomizableUI.addWidgetToArea('separator', 'nav-bar');
+    CustomizableUI.addWidgetToArea("separator", "nav-bar");
     yield startCustomizing();
     let separator = navbar.querySelector(separatorSelector);
     ok(separator, "There should be a separator in the navbar now.");
     let palette = document.getElementById("customization-palette");
     simulateItemDrag(separator, palette);
     ok(!palette.querySelector(separatorSelector), "No separator in the palette.");
   } catch (ex) {
     Cu.reportError(ex);
--- a/browser/components/customizableui/test/browser_969661_character_encoding_navbar_disabled.js
+++ b/browser/components/customizableui/test/browser_969661_character_encoding_navbar_disabled.js
@@ -10,17 +10,17 @@
 add_task(function*() {
   yield startCustomizing();
   CustomizableUI.addWidgetToArea("characterencoding-button", "PanelUI-contents");
   yield endCustomizing();
   yield PanelUI.show();
   let panelHiddenPromise = promisePanelHidden(window);
   PanelUI.hide();
   yield panelHiddenPromise;
-  CustomizableUI.addWidgetToArea("characterencoding-button", 'nav-bar');
+  CustomizableUI.addWidgetToArea("characterencoding-button", "nav-bar");
   let button = document.getElementById("characterencoding-button");
   ok(!button.hasAttribute("disabled"), "Button shouldn't be disabled");
 });
 
 add_task(function asyncCleanup() {
   resetCustomization();
 });
 
--- a/browser/components/customizableui/test/browser_973641_button_addon.js
+++ b/browser/components/customizableui/test/browser_973641_button_addon.js
@@ -8,17 +8,17 @@ const kButton = "test_button_for_addon";
 var initialLocation = gBrowser.currentURI.spec;
 
 add_task(function*() {
   info("Check addon button functionality");
 
   // create mocked addon button on the navigation bar
   let widgetSpec = {
     id: kButton,
-    type: 'button',
+    type: "button",
     onClick() {
       gBrowser.selectedTab = gBrowser.addTab("about:addons");
     }
   };
   CustomizableUI.createWidget(widgetSpec);
   CustomizableUI.addWidgetToArea(kButton, CustomizableUI.AREA_NAVBAR);
 
   // check the button's functionality in navigation bar
--- a/browser/components/customizableui/test/browser_973932_addonbar_currentset.js
+++ b/browser/components/customizableui/test/browser_973932_addonbar_currentset.js
@@ -5,26 +5,26 @@
 "use strict";
 
 var addonbarID = CustomizableUI.AREA_ADDONBAR;
 var addonbar = document.getElementById(addonbarID);
 
 // Check that currentset is correctly updated after a reset:
 add_task(function*() {
   let placements = CustomizableUI.getWidgetIdsInArea(addonbarID);
-  is(placements.join(','), addonbar.getAttribute("currentset"), "Addon-bar currentset should match default placements");
+  is(placements.join(","), addonbar.getAttribute("currentset"), "Addon-bar currentset should match default placements");
   ok(CustomizableUI.inDefaultState, "Should be in default state");
   info("Adding a spring to add-on bar shim");
   CustomizableUI.addWidgetToArea("spring", addonbarID, 1);
   ok(addonbar.getElementsByTagName("toolbarspring").length, "There should be a spring in the toolbar");
   ok(!CustomizableUI.inDefaultState, "Should no longer be in default state");
   placements = CustomizableUI.getWidgetIdsInArea(addonbarID);
-  is(placements.join(','), addonbar.getAttribute("currentset"), "Addon-bar currentset should match placements after spring addition");
+  is(placements.join(","), addonbar.getAttribute("currentset"), "Addon-bar currentset should match placements after spring addition");
 
   yield startCustomizing();
   yield gCustomizeMode.reset();
   ok(CustomizableUI.inDefaultState, "Should be in default state after reset");
   placements = CustomizableUI.getWidgetIdsInArea(addonbarID);
-  is(placements.join(','), addonbar.getAttribute("currentset"), "Addon-bar currentset should match default placements after reset");
+  is(placements.join(","), addonbar.getAttribute("currentset"), "Addon-bar currentset should match default placements after reset");
   ok(!addonbar.getElementsByTagName("toolbarspring").length, "There should be no spring in the toolbar");
   yield endCustomizing();
 });
 
--- a/browser/components/customizableui/test/browser_981418-widget-onbeforecreated-handler.js
+++ b/browser/components/customizableui/test/browser_981418-widget-onbeforecreated-handler.js
@@ -1,29 +1,29 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
-const kWidgetId = 'test-981418-widget-onbeforecreated';
+const kWidgetId = "test-981418-widget-onbeforecreated";
 
 // Should be able to add broken view widget
 add_task(function* testAddOnBeforeCreatedWidget() {
   let viewShownDeferred = Promise.defer();
   let onBeforeCreatedCalled = false;
   let widgetSpec = {
     id: kWidgetId,
-    type: 'view',
-    viewId: kWidgetId + 'idontexistyet',
+    type: "view",
+    viewId: kWidgetId + "idontexistyet",
     onBeforeCreated(doc) {
       let view = doc.createElement("panelview");
-      view.id = kWidgetId + 'idontexistyet';
+      view.id = kWidgetId + "idontexistyet";
       let label = doc.createElement("label");
       label.setAttribute("value", "Hello world");
-      label.className = 'panel-subview-header';
+      label.className = "panel-subview-header";
       view.appendChild(label);
       document.getElementById("PanelUI-multiView").appendChild(view);
       onBeforeCreatedCalled = true;
     },
     onViewShowing() {
       viewShownDeferred.resolve();
     }
   };
--- a/browser/components/feeds/FeedConverter.js
+++ b/browser/components/feeds/FeedConverter.js
@@ -541,23 +541,23 @@ GenericProtocolHandler.prototype = {
     if (iid.equals(Ci.nsIProtocolHandler) ||
         iid.equals(Ci.nsISupports))
       return this;
     throw Cr.NS_ERROR_NO_INTERFACE;
   }
 };
 
 function FeedProtocolHandler() {
-  this._init('feed');
+  this._init("feed");
 }
 FeedProtocolHandler.prototype = new GenericProtocolHandler();
 FeedProtocolHandler.prototype.classID = Components.ID("{4f91ef2e-57ba-472e-ab7a-b4999e42d6c0}");
 
 function PodCastProtocolHandler() {
-  this._init('pcast');
+  this._init("pcast");
 }
 PodCastProtocolHandler.prototype = new GenericProtocolHandler();
 PodCastProtocolHandler.prototype.classID = Components.ID("{1c31ed79-accd-4b94-b517-06e0c81999d5}");
 
 var components = [FeedConverter,
                   FeedResultService,
                   FeedProtocolHandler,
                   PodCastProtocolHandler];
--- a/browser/components/feeds/FeedWriter.js
+++ b/browser/components/feeds/FeedWriter.js
@@ -175,17 +175,17 @@ FeedWriter.prototype = {
 
   _setContentText(id, text) {
     let element = this._document.getElementById(id);
     let textNode = text.createDocumentFragment(element);
     while (element.hasChildNodes())
       element.removeChild(element.firstChild);
     element.appendChild(textNode);
     if (text.base) {
-      element.setAttributeNS(XML_NS, 'base', text.base.spec);
+      element.setAttributeNS(XML_NS, "base", text.base.spec);
     }
   },
 
   /**
    * Safely sets the href attribute on an anchor tag, providing the URI
    * specified can be loaded according to rules.
    * @param   element
    *          The element to set a URI attribute on
@@ -227,25 +227,25 @@ FeedWriter.prototype = {
   },
 
   _getString(key) {
     return this._bundle.GetStringFromName(key);
   },
 
   _setCheckboxCheckedState(aCheckbox, aValue) {
     // see checkbox.xml, xbl bindings are not applied within the sandbox! TODO
-    let change = (aValue != (aCheckbox.getAttribute('checked') == 'true'));
+    let change = (aValue != (aCheckbox.getAttribute("checked") == "true"));
     if (aValue)
-      aCheckbox.setAttribute('checked', 'true');
+      aCheckbox.setAttribute("checked", "true");
     else
-      aCheckbox.removeAttribute('checked');
+      aCheckbox.removeAttribute("checked");
 
     if (change) {
-      let event = this._document.createEvent('Events');
-      event.initEvent('CheckboxStateChange', true, true);
+      let event = this._document.createEvent("Events");
+      event.initEvent("CheckboxStateChange", true, true);
       aCheckbox.dispatchEvent(event);
     }
   },
 
    /**
    * Returns a date suitable for displaying in the feed preview.
    * If the date cannot be parsed, the return value is "false".
    * @param   dateString
@@ -263,18 +263,18 @@ FeedWriter.prototype = {
   },
 
   __dateFormatter: null,
   get _dateFormatter() {
     if (!this.__dateFormatter) {
       const locale = Cc["@mozilla.org/chrome/chrome-registry;1"]
                      .getService(Ci.nsIXULChromeRegistry)
                      .getSelectedLocale("global", true);
-      const dtOptions = { year: 'numeric', month: 'long', day: 'numeric',
-                          hour: 'numeric', minute: 'numeric' };
+      const dtOptions = { year: "numeric", month: "long", day: "numeric",
+                          hour: "numeric", minute: "numeric" };
       this.__dateFormatter = new Intl.DateTimeFormat(locale, dtOptions);
     }
     return this.__dateFormatter;
   },
 
   /**
    * Returns the feed type.
    */
@@ -346,18 +346,18 @@ FeedWriter.prototype = {
 
       let titleText = this._getFormattedString("linkTitleTextFormat",
                                                [parts.getPropertyAsAString("title")]);
       let feedTitleText = this._document.getElementById("feedTitleText");
       let titleImageWidth = parseInt(parts.getPropertyAsAString("width")) + 15;
 
       // Fix the margin on the main title, so that the image doesn't run over
       // the underline
-      feedTitleLink.setAttribute('title', titleText);
-      feedTitleText.style.marginRight = titleImageWidth + 'px';
+      feedTitleLink.setAttribute("title", titleText);
+      feedTitleText.style.marginRight = titleImageWidth + "px";
 
       this._safeSetURIAttribute(feedTitleLink, "href",
                                 parts.getPropertyAsAString("link"));
     } catch (e) {
       LOG("Failed to set Title Image (this is benign): " + e);
     }
   },
 
@@ -742,25 +742,25 @@ FeedWriter.prototype = {
       return;
 
     let feedType = this._getFeedType();
 
     // change the background
     let header = this._document.getElementById("feedHeader");
     switch (feedType) {
       case Ci.nsIFeed.TYPE_VIDEO:
-        header.className = 'videoPodcastBackground';
+        header.className = "videoPodcastBackground";
         break;
 
       case Ci.nsIFeed.TYPE_AUDIO:
-        header.className = 'audioPodcastBackground';
+        header.className = "audioPodcastBackground";
         break;
 
       default:
-        header.className = 'feedBackground';
+        header.className = "feedBackground";
     }
 
     let liveBookmarksMenuItem = this._document.getElementById("liveBookmarksMenuItem");
 
     // Last-selected application
     let menuItem = liveBookmarksMenuItem.cloneNode(false);
     menuItem.removeAttribute("selected");
     menuItem.setAttribute("id", "selectedAppMenuItem");
@@ -858,17 +858,17 @@ FeedWriter.prototype = {
       let feedinfo1 = this._document.getElementById("feedSubscriptionInfo1");
       let feedinfo1Str = this._getString(textfeedinfo1);
       let feedinfo2 = this._document.getElementById("feedSubscriptionInfo2");
       let feedinfo2Str = this._getString(textfeedinfo2);
 
       feedinfo1.textContent = feedinfo1Str;
       feedinfo2.textContent = feedinfo2Str;
 
-      header.setAttribute('firstrun', 'true');
+      header.setAttribute("firstrun", "true");
 
       this._mm.sendAsyncMessage("FeedWriter:ShownFirstRun");
     }
   },
 
   /**
    * Returns the original URI object of the feed and ensures that this
    * component is only ever invoked from the preview document.
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -98,21 +98,21 @@ if (AppConstants.MOZ_CRASHREPORTER) {
                                     "resource:///modules/ContentCrashHandlers.jsm");
   XPCOMUtils.defineLazyModuleGetter(this, "UnsubmittedCrashHandler",
                                     "resource:///modules/ContentCrashHandlers.jsm");
   XPCOMUtils.defineLazyModuleGetter(this, "CrashSubmit",
                                     "resource://gre/modules/CrashSubmit.jsm");
 }
 
 XPCOMUtils.defineLazyGetter(this, "gBrandBundle", function() {
-  return Services.strings.createBundle('chrome://branding/locale/brand.properties');
+  return Services.strings.createBundle("chrome://branding/locale/brand.properties");
 });
 
 XPCOMUtils.defineLazyGetter(this, "gBrowserBundle", function() {
-  return Services.strings.createBundle('chrome://browser/locale/browser.properties');
+  return Services.strings.createBundle("chrome://browser/locale/browser.properties");
 });
 
 // Seconds of idle before trying to create a bookmarks backup.
 const BOOKMARKS_BACKUP_IDLE_TIME_SEC = 8 * 60;
 // Minimum interval between backups.  We try to not create more than one backup
 // per interval.
 const BOOKMARKS_BACKUP_MIN_INTERVAL_DAYS = 1;
 // Maximum interval between backups.  If the last backup is older than these
@@ -504,17 +504,17 @@ BrowserGlue.prototype = {
       if (!win) {
         return;
       }
 
       let brandBundle = win.document.getElementById("bundle_brand");
       let brandShortName = brandBundle.getString("brandShortName");
       let message = win.gNavigatorBundle.getFormattedString("addonwatch.slow", [addon.name, brandShortName]);
       let notificationBox = win.document.getElementById("global-notificationbox");
-      let notificationId = 'addon-slow:' + addonId;
+      let notificationId = "addon-slow:" + addonId;
       let notification = notificationBox.getNotificationWithValue(notificationId);
 
       // Monitor the response of users
       const STATE_WARNING_DISPLAYED = 0;
       const STATE_USER_PICKED_DISABLE = 1;
       const STATE_USER_PICKED_IGNORE_FOR_NOW = 2;
       const STATE_USER_PICKED_IGNORE_FOREVER = 3;
       const STATE_USER_CLOSED_NOTIFICATION = 4;
--- a/browser/components/originattributes/test/browser/browser_cache.js
+++ b/browser/components/originattributes/test/browser/browser_cache.js
@@ -147,20 +147,20 @@ function* doTest(aBrowser) {
 
   yield ContentTask.spawn(aBrowser, argObj, function* (arg) {
     let videoURL = arg.urlPrefix + "file_thirdPartyChild.video.ogv";
     let audioURL = arg.urlPrefix + "file_thirdPartyChild.audio.ogg";
     let trackURL = arg.urlPrefix + "file_thirdPartyChild.track.vtt";
     let URLSuffix = "?r=" + arg.randomSuffix;
 
     // Create the audio and video elements.
-    let audio = content.document.createElement('audio');
-    let video = content.document.createElement('video');
-    let audioSource = content.document.createElement('source');
-    let audioTrack = content.document.createElement('track');
+    let audio = content.document.createElement("audio");
+    let video = content.document.createElement("video");
+    let audioSource = content.document.createElement("source");
+    let audioTrack = content.document.createElement("track");
 
     // Append the audio and track element into the body, and wait until they're finished.
     yield new Promise(resolve => {
       let audioLoaded = false;
       let trackLoaded = false;
 
       let audioListener = () => {
         audio.removeEventListener("canplaythrough", audioListener);
--- a/browser/components/originattributes/test/browser/browser_httpauth.js
+++ b/browser/components/originattributes/test/browser/browser_httpauth.js
@@ -1,17 +1,17 @@
 let Cu = Components.utils;
 let {HttpServer} = Cu.import("resource://testing-common/httpd.js", {});
 
 let server = new HttpServer();
-server.registerPathHandler('/file.html', fileHandler);
+server.registerPathHandler("/file.html", fileHandler);
 server.start(-1);
 
-let BASE_URI = 'http://localhost:' + server.identity.primaryPort;
-let FILE_URI = BASE_URI + '/file.html';
+let BASE_URI = "http://localhost:" + server.identity.primaryPort;
+let FILE_URI = BASE_URI + "/file.html";
 
 let credentialQueue = [];
 
 // Ask the user agent for authorization.
 function fileHandler(metadata, response) {
   if (!metadata.hasHeader("Authorization")) {
     response.setStatusLine(metadata.httpVersion, 401, "Unauthorized");
     response.setHeader("WWW-Authenticate", "Basic realm=\"User Visible Realm\"");
--- a/browser/components/originattributes/test/browser/browser_imageCacheIsolation.js
+++ b/browser/components/originattributes/test/browser/browser_imageCacheIsolation.js
@@ -8,32 +8,32 @@ let Cu = Components.utils;
 let {HttpServer} = Cu.import("resource://testing-common/httpd.js", {});
 
 const NUM_ISOLATION_LOADS = 2;
 const NUM_CACHED_LOADS = 1;
 
 let gHits = 0;
 
 let server = new HttpServer();
-server.registerPathHandler('/image.png', imageHandler);
-server.registerPathHandler('/file.html', fileHandler);
+server.registerPathHandler("/image.png", imageHandler);
+server.registerPathHandler("/file.html", fileHandler);
 server.start(-1);
 
 registerCleanupFunction(() => {
   server.stop(() => {
     server = null;
   });
 });
 
-let BASE_URI = 'http://localhost:' + server.identity.primaryPort;
-let IMAGE_URI = BASE_URI + '/image.png';
-let FILE_URI = BASE_URI + '/file.html';
+let BASE_URI = "http://localhost:" + server.identity.primaryPort;
+let IMAGE_URI = BASE_URI + "/image.png";
+let FILE_URI = BASE_URI + "/file.html";
 
 function imageHandler(metadata, response) {
-  info('XXX: loading image from server');
+  info("XXX: loading image from server");
   gHits++;
   response.setHeader("Cache-Control", "max-age=10000", false);
   response.setStatusLine(metadata.httpVersion, 200, "OK");
   response.setHeader("Content-Type", "image/png", false);
   var body = "iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAAEUlEQVQImWP4z8AAQTAamQkAhpcI+DeMzFcAAAAASUVORK5CYII=";
   response.bodyOutputStream.write(body, body.length);
 }
 
@@ -41,25 +41,25 @@ function fileHandler(metadata, response)
   response.setStatusLine(metadata.httpVersion, 200, "OK");
   response.setHeader("Content-Type", "text/html", false);
   let body = `<html><body><image src=${IMAGE_URI}></body></html>`;
   response.bodyOutputStream.write(body, body.length);
 }
 
 function doBefore() {
   // reset hit counter
-  info('XXX resetting gHits');
+  info("XXX resetting gHits");
   gHits = 0;
-  info('XXX clearing image cache');
+  info("XXX clearing image cache");
   let imageCache = Cc["@mozilla.org/image/tools;1"]
                       .getService(Ci.imgITools)
                       .getImgCacheForDocument(null);
   imageCache.clearCache(true);
   imageCache.clearCache(false);
-  info('XXX clearning network cache');
+  info("XXX clearning network cache");
   let networkCache = Cc["@mozilla.org/netwerk/cache-storage-service;1"]
                         .getService(Ci.nsICacheStorageService);
   networkCache.clear();
 }
 
 // the test function does nothing on purpose.
 function doTest(aBrowser) {
   return 0;
--- a/browser/components/originattributes/test/browser/head.js
+++ b/browser/components/originattributes/test/browser/head.js
@@ -1,13 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-'use strict';
+"use strict";
 
 const TEST_URL_PATH = "/browser/browser/components/originattributes/test/browser/";
 
 // The flags of test modes.
 const TEST_MODE_FIRSTPARTY   = 0;
 const TEST_MODE_NO_ISOLATION = 1;
 const TEST_MODE_CONTAINERS   = 2;
 
@@ -68,17 +68,17 @@ function* openTabInUserContext(aURL, aUs
  *
  * @return tab     - The tab object of this tab.
  *         browser - The browser object of this tab.
  */
 function* openTabInFirstParty(aURL, aFirstPartyDomain,
                               aFrameSetting = DEFAULT_FRAME_SETTING) {
 
   // If the first party domain ends with '/', we remove it.
-  if (aFirstPartyDomain.endsWith('/')) {
+  if (aFirstPartyDomain.endsWith("/")) {
     aFirstPartyDomain = aFirstPartyDomain.slice(0, -1);
   }
 
   let basicPageURL = aFirstPartyDomain + gFirstPartyBasicPage;
 
   // Open the tab for the basic first party page.
   let tab = gBrowser.addTab(basicPageURL);
 
@@ -112,31 +112,31 @@ function* openTabInFirstParty(aURL, aFir
     let numOfLayers = 0;
 
     for (let type of arg.frames) {
       let document = content.document;
       numOfLayers++;
 
       if (type === typeFrame) {
         // Add a frameset which carries the frame element.
-        let frameSet = document.createElement('frameset');
+        let frameSet = document.createElement("frameset");
         frameSet.cols = "50%,50%";
 
-        let frame = document.createElement('frame');
-        let dummyFrame = document.createElement('frame');
+        let frame = document.createElement("frame");
+        let dummyFrame = document.createElement("frame");
 
         frameSet.appendChild(frame);
         frameSet.appendChild(dummyFrame);
 
         document.body.appendChild(frameSet);
 
         frameElement = frame;
       } else if (type === typeIFrame) {
         // Add an iframe.
-        let iframe = document.createElement('iframe');
+        let iframe = document.createElement("iframe");
         document.body.appendChild(iframe);
 
         frameElement = iframe;
       } else {
         ok(false, "Invalid frame type.");
         break;
       }
 
--- a/browser/components/originattributes/test/browser/window_redirect.html
+++ b/browser/components/originattributes/test/browser/window_redirect.html
@@ -1,12 +1,12 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
 <html>
   <head>
     <meta charset="utf8">
     <title>Page creating a popup</title>
   </head>
   <body>
     <script type="text/javascript">
-       var w = window.open('test_firstParty_http_redirect_to_same_domain.html', "test");
+       var w = window.open("test_firstParty_http_redirect_to_same_domain.html", "test");
     </script>
   </body>
 </html>
--- a/browser/components/places/content/bookmarkProperties.js
+++ b/browser/components/places/content/bookmarkProperties.js
@@ -52,17 +52,17 @@
  *     - "tags"
  *     - "loadInSidebar"
  *     - "folderPicker" - hides both the tree and the menu.
  *
  * window.arguments[0].performed is set to true if any transaction has
  * been performed by the dialog.
  */
 
-Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
                                   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Task",
                                   "resource://gre/modules/Task.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PromiseUtils",
                                   "resource://gre/modules/PromiseUtils.jsm");
 
 const BOOKMARK_ITEM = 0;
--- a/browser/components/places/content/bookmarksPanel.js
+++ b/browser/components/places/content/bookmarksPanel.js
@@ -4,17 +4,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 function init() {
   document.getElementById("bookmarks-view").place =
     "place:queryType=1&folder=" + window.top.PlacesUIUtils.allBookmarksFolderId;
 }
 
 function searchBookmarks(aSearchString) {
-  var tree = document.getElementById('bookmarks-view');
+  var tree = document.getElementById("bookmarks-view");
   if (!aSearchString)
     tree.place = tree.place;
   else
     tree.applyFilter(aSearchString,
                      [PlacesUtils.bookmarksMenuFolderId,
                       PlacesUtils.unfiledBookmarksFolderId,
                       PlacesUtils.toolbarFolderId]);
 }
--- a/browser/components/places/content/menu.xml
+++ b/browser/components/places/content/menu.xml
@@ -404,17 +404,17 @@
           dropPoint.folderElt.setAttribute("_moz-menuactive", true);
         } else {
           // We are not dragging over a folder.
           // Clear out old _overFolder information.
           this._overFolder.clear();
         }
 
         // Autoscroll the popup strip if we drag over the scroll buttons.
-        let anonid = event.originalTarget.getAttribute('anonid');
+        let anonid = event.originalTarget.getAttribute("anonid");
         let scrollDir = 0;
         if (anonid == "scrollbutton-up") {
           scrollDir = -1;
         } else if (anonid == "scrollbutton-down") {
           scrollDir = 1;
         }
         if (scrollDir != 0) {
           this._scrollBox.scrollByIndex(scrollDir, false);
@@ -505,17 +505,17 @@
             <children/>
           </xul:arrowscrollbox>
         </xul:box>
       </xul:vbox>
     </content>
 
     <implementation>
       <constructor><![CDATA[
-        this.style.pointerEvents = 'none';
+        this.style.pointerEvents = "none";
       ]]></constructor>
       <method name="adjustArrowPosition">
         <body><![CDATA[
           var arrow = document.getAnonymousElementByAttribute(this, "anonid", "arrow");
 
           var anchor = this.anchorNode;
           if (!anchor) {
             arrow.hidden = true;
@@ -607,15 +607,15 @@
         }
       ]]></handler>
       <handler event="popuphiding" phase="target"><![CDATA[
         this.setAttribute("animate", "cancel");
       ]]></handler>
       <handler event="popuphidden" phase="target"><![CDATA[
         this.removeAttribute("panelopen");
         if (this.getAttribute("disablepointereventsfortransition") == "true") {
-          this.style.pointerEvents = 'none';
+          this.style.pointerEvents = "none";
         }
         this.removeAttribute("animate");
       ]]></handler>
     </handlers>
   </binding>
 </bindings>
--- a/browser/components/places/content/places.js
+++ b/browser/components/places/content/places.js
@@ -405,17 +405,17 @@ var PlacesOrganizer = {
    * Populates the restore menu with the dates of the backups available.
    */
   populateRestoreMenu: function PO_populateRestoreMenu() {
     let restorePopup = document.getElementById("fileRestorePopup");
 
     const locale = Cc["@mozilla.org/chrome/chrome-registry;1"]
                    .getService(Ci.nsIXULChromeRegistry)
                    .getSelectedLocale("global", true);
-    const dtOptions = { year: 'numeric', month: 'long', day: 'numeric' };
+    const dtOptions = { year: "numeric", month: "long", day: "numeric" };
     let dateFormatter = new Intl.DateTimeFormat(locale, dtOptions);
 
     // Remove existing menu items.  Last item is the restoreFromFile item.
     while (restorePopup.childNodes.length > 1)
       restorePopup.removeChild(restorePopup.firstChild);
 
     Task.spawn(function* () {
       let backupFiles = yield PlacesBackups.getBackupFiles();
@@ -691,17 +691,17 @@ var PlacesOrganizer = {
 
   // NOT YET USED
   _updateThumbnail: function PO__updateThumbnail() {
     var bo = document.getElementById("previewBox").boxObject;
     var width  = bo.width;
     var height = bo.height;
 
     var canvas = document.getElementById("itemThumbnail");
-    var ctx = canvas.getContext('2d');
+    var ctx = canvas.getContext("2d");
     var notAvailableText = canvas.getAttribute("notavailabletext");
     ctx.save();
     ctx.fillStyle = "-moz-Dialog";
     ctx.fillRect(0, 0, width, height);
     ctx.translate(width / 2, height / 2);
 
     ctx.fillStyle = "GrayText";
     ctx.mozTextStyle = "12pt sans serif";
--- a/browser/components/places/content/treeView.js
+++ b/browser/components/places/content/treeView.js
@@ -1,13 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 const PTV_interfaces = [Ci.nsITreeView,
                         Ci.nsINavHistoryResultObserver,
                         Ci.nsINavHistoryResultTreeViewer,
                         Ci.nsISupportsWeakReference];
 
 function PlacesTreeView(aFlatList, aOnOpenFlatContainer, aController) {
   this._tree = null;
@@ -497,30 +497,30 @@ PlacesTreeView.prototype = {
   // We use a different formatter for times within the current day,
   // so we cache both a "today" formatter and a general date formatter.
   __todayFormatter: null,
   get _todayFormatter() {
     if (!this.__todayFormatter) {
       const locale = Cc["@mozilla.org/chrome/chrome-registry;1"]
                      .getService(Ci.nsIXULChromeRegistry)
                      .getSelectedLocale("global", true);
-      const dtOptions = { hour: 'numeric', minute: 'numeric' };
+      const dtOptions = { hour: "numeric", minute: "numeric" };
       this.__todayFormatter = new Intl.DateTimeFormat(locale, dtOptions);
     }
     return this.__todayFormatter;
   },
 
   __dateFormatter: null,
   get _dateFormatter() {
     if (!this.__dateFormatter) {
       const locale = Cc["@mozilla.org/chrome/chrome-registry;1"]
                      .getService(Ci.nsIXULChromeRegistry)
                      .getSelectedLocale("global", true);
-      const dtOptions = { year: '2-digit', month: 'numeric', day: 'numeric',
-                          hour: 'numeric', minute: 'numeric' };
+      const dtOptions = { year: "2-digit", month: "numeric", day: "numeric",
+                          hour: "numeric", minute: "numeric" };
       this.__dateFormatter = new Intl.DateTimeFormat(locale, dtOptions);
     }
     return this.__dateFormatter;
   },
 
   COLUMN_TYPE_UNKNOWN: 0,
   COLUMN_TYPE_TITLE: 1,
   COLUMN_TYPE_URI: 2,
--- a/browser/components/places/tests/browser/browser_410196_paste_into_tags.js
+++ b/browser/components/places/tests/browser/browser_410196_paste_into_tags.js
@@ -88,17 +88,17 @@ add_task(function* () {
 
 function focusTag(PlacesOrganizer) {
   PlacesOrganizer.selectLeftPaneQuery("Tags");
   let tags = PlacesOrganizer._places.selectedNode;
   tags.containerOpen = true;
   let fooTag = tags.getChild(0);
   let tagNode = fooTag;
   PlacesOrganizer._places.selectNode(fooTag);
-  is(tagNode.title, 'foo', "tagNode title is foo");
+  is(tagNode.title, "foo", "tagNode title is foo");
   let ip = PlacesOrganizer._places.insertionPoint;
   ok(ip.isTag, "IP is a tag");
 }
 
 function copyHistNode(PlacesOrganizer, ContentTree) {
   // focus the history object
   PlacesOrganizer.selectLeftPaneQuery("History");
   let histContainer = PlacesOrganizer._places.selectedNode;
--- a/browser/components/places/tests/browser/browser_bookmarkProperties_editTagContainer.js
+++ b/browser/components/places/tests/browser/browser_bookmarkProperties_editTagContainer.js
@@ -21,17 +21,17 @@ add_task(function* () {
 
   PlacesOrganizer.selectLeftPaneQuery("Tags");
   let tree = PlacesOrganizer._places;
   let tagsContainer = tree.selectedNode;
   tagsContainer.containerOpen = true;
   let fooTag = tagsContainer.getChild(0);
   let tagNode = fooTag;
   tree.selectNode(fooTag);
-  is(tagNode.title, 'tag1', "tagNode title is correct");
+  is(tagNode.title, "tag1", "tagNode title is correct");
 
   ok(tree.controller.isCommandEnabled("placesCmd_show:info"),
      "'placesCmd_show:info' on current selected node is enabled");
 
   yield withBookmarksDialog(
     true,
     function openDialog() {
       tree.controller.doCommand("placesCmd_show:info");
--- a/browser/components/places/tests/browser/browser_bookmarklet_windowOpen.js
+++ b/browser/components/places/tests/browser/browser_bookmarklet_windowOpen.js
@@ -1,28 +1,28 @@
 "use strict";
 
-const TEST_URL = 'http://example.com/browser/browser/components/places/tests/browser/pageopeningwindow.html';
+const TEST_URL = "http://example.com/browser/browser/components/places/tests/browser/pageopeningwindow.html";
 
 function makeBookmarkFor(url, keyword) {
   return Promise.all([
     PlacesUtils.bookmarks.insert({ parentGuid: PlacesUtils.bookmarks.unfiledGuid,
                                    title: "bookmarklet",
                                    url }),
     PlacesUtils.keywords.insert({url,
                                  keyword})
   ]);
 
 }
 
 add_task(function* openKeywordBookmarkWithWindowOpen() {
   // This is the current default, but let's not assume that...
   yield SpecialPowers.pushPrefEnv({"set": [
-    [ 'browser.link.open_newwindow', 3 ],
-    [ 'dom.disable_open_during_load', true ]
+    [ "browser.link.open_newwindow", 3 ],
+    [ "dom.disable_open_during_load", true ]
   ]});
 
   let moztab;
   let tabOpened = BrowserTestUtils.openNewForegroundTab(gBrowser, "about:mozilla")
                     .then((tab) => { moztab = tab; });
   let keywordForBM = "openmeatab";
 
   let bookmarkInfo;
--- a/browser/components/places/tests/browser/browser_library_commands.js
+++ b/browser/components/places/tests/browser/browser_library_commands.js
@@ -19,17 +19,17 @@ add_task(function* test_date_container()
   let library = yield promiseLibrary();
   info("Ensure date containers under History cannot be cut but can be deleted");
 
   yield PlacesTestUtils.addVisits(TEST_URI);
 
   // Select and open the left pane "History" query.
   let PO = library.PlacesOrganizer;
 
-  PO.selectLeftPaneQuery('History');
+  PO.selectLeftPaneQuery("History");
   isnot(PO._places.selectedNode, null, "We correctly selected History");
 
   // Check that both delete and cut commands are disabled, cause this is
   // a child of the left pane folder.
   ok(PO._places.controller.isCommandEnabled("cmd_copy"),
      "Copy command is enabled");
   ok(!PO._places.controller.isCommandEnabled("cmd_cut"),
      "Cut command is disabled");
@@ -76,17 +76,17 @@ add_task(function* test_date_container()
 
 add_task(function* test_query_on_toolbar() {
   let library = yield promiseLibrary();
   info("Ensure queries can be cut or deleted");
 
   // Select and open the left pane "Bookmarks Toolbar" folder.
   let PO = library.PlacesOrganizer;
 
-  PO.selectLeftPaneQuery('BookmarksToolbar');
+  PO.selectLeftPaneQuery("BookmarksToolbar");
   isnot(PO._places.selectedNode, null, "We have a valid selection");
   is(PlacesUtils.getConcreteItemId(PO._places.selectedNode),
      PlacesUtils.toolbarFolderId,
      "We have correctly selected bookmarks toolbar node.");
 
   // Check that both cut and delete commands are disabled, cause this is a child
   // of AllBookmarksFolderId.
   ok(PO._places.controller.isCommandEnabled("cmd_copy"),
@@ -145,17 +145,17 @@ add_task(function* test_search_contents(
                                        index: 0 });
 
   let library = yield promiseLibrary();
   info("Ensure query contents can be cut or deleted");
 
   // Select and open the left pane "Bookmarks Toolbar" folder.
   let PO = library.PlacesOrganizer;
 
-  PO.selectLeftPaneQuery('BookmarksToolbar');
+  PO.selectLeftPaneQuery("BookmarksToolbar");
   isnot(PO._places.selectedNode, null, "We have a valid selection");
   is(PlacesUtils.getConcreteItemId(PO._places.selectedNode),
      PlacesUtils.toolbarFolderId,
      "We have correctly selected bookmarks toolbar node.");
 
   let searchBox = library.document.getElementById("searchFilter");
   searchBox.value = "example";
   library.PlacesSearchBox.search(searchBox.value);
@@ -183,17 +183,17 @@ add_task(function* test_tags() {
   PlacesUtils.tagging.tagURI(NetUtil.newURI("http://example.com/"), ["test"]);
 
   let library = yield promiseLibrary();
   info("Ensure query contents can be cut or deleted");
 
   // Select and open the left pane "Bookmarks Toolbar" folder.
   let PO = library.PlacesOrganizer;
 
-  PO.selectLeftPaneQuery('Tags');
+  PO.selectLeftPaneQuery("Tags");
   let tagsNode = PO._places.selectedNode;
   isnot(tagsNode, null, "We have a valid selection");
   let tagsTitle = PlacesUtils.getString("TagsFolderTitle");
   is(tagsNode.title, tagsTitle,
      "Tags has been properly selected");
 
   // Check that both cut and delete commands are disabled.
   ok(PO._places.controller.isCommandEnabled("cmd_copy"),
--- a/browser/components/places/tests/browser/browser_library_panel_leak.js
+++ b/browser/components/places/tests/browser/browser_library_panel_leak.js
@@ -24,17 +24,17 @@ function test() {
     isnot(contentTree, null, "Sanity check: placeContent tree should exist");
     isnot(organizer.PlacesOrganizer, null, "Sanity check: PlacesOrganizer should exist");
     isnot(organizer.gEditItemOverlay, null, "Sanity check: gEditItemOverlay should exist");
 
     ok(organizer.gEditItemOverlay.initialized, "gEditItemOverlay is initialized");
     isnot(organizer.gEditItemOverlay.itemId, -1, "Editing a bookmark");
 
     // Select History in the left pane.
-    organizer.PlacesOrganizer.selectLeftPaneQuery('History');
+    organizer.PlacesOrganizer.selectLeftPaneQuery("History");
     // Select the first history entry.
     let selection = contentTree.view.selection;
     selection.clearSelection();
     selection.rangedSelect(0, 0, true);
     // Check the panel is editing the history entry.
     is(organizer.gEditItemOverlay.itemId, -1, "Editing an history entry");
     // Close Library window.
     organizer.close();
--- a/browser/components/places/tests/browser/pageopeningwindow.html
+++ b/browser/components/places/tests/browser/pageopeningwindow.html
@@ -1,9 +1,9 @@
 <meta charset="UTF-8">
 Hi, I was opened via a <script>document.write(location.search ?
   "popup call from the opened window... uh oh, that shouldn't happen!" :
   "bookmarklet, and I will open a new window myself.")</script><br>
 <script>
   if (!location.search) {
-    open(location.href + "?donotopen=true", '_blank');
+    open(location.href + "?donotopen=true", "_blank");
   }
 </script>
--- a/browser/components/preferences/connection.js
+++ b/browser/components/preferences/connection.js
@@ -174,19 +174,19 @@ var gConnectionsDialog = {
       autoURLPref.value = autoURL.value = URIFixup.createFixupURI(autoURL.value, 0).spec;
     } catch (ex) {}
   },
 
   sanitizeNoProxiesPref() {
     var noProxiesPref = document.getElementById("network.proxy.no_proxies_on");
     // replace substrings of ; and \n with commas if they're neither immediately
     // preceded nor followed by a valid separator character
-    noProxiesPref.value = noProxiesPref.value.replace(/([^, \n;])[;\n]+(?![,\n;])/g, '$1,');
+    noProxiesPref.value = noProxiesPref.value.replace(/([^, \n;])[;\n]+(?![,\n;])/g, "$1,");
     // replace any remaining ; and \n since some may follow commas, etc.
-    noProxiesPref.value = noProxiesPref.value.replace(/[;\n]/g, '');
+    noProxiesPref.value = noProxiesPref.value.replace(/[;\n]/g, "");
   },
 
   readHTTPProxyServer() {
     var shareProxiesPref = document.getElementById("network.proxy.share_proxy_settings");
     if (shareProxiesPref.value)
       this.updateProtocolPrefs();
     return undefined;
   },
--- a/browser/components/preferences/containers.js
+++ b/browser/components/preferences/containers.js
@@ -100,17 +100,17 @@ let gContainersManager = {
 
       if (this.identity.icon && this.identity.icon == icon) {
         iconSwatch.setAttribute("selected", true);
       }
 
       iconSwatch.setAttribute("label",
         containersBundle.GetStringFromName(`containers.${icon}.label`));
       let iconElement = document.createElement("hbox");
-      iconElement.className = 'userContext-icon';
+      iconElement.className = "userContext-icon";
       iconElement.setAttribute("data-identity-icon", icon);
 
       iconSwatch.appendChild(iconElement);
       radiogroup.appendChild(iconSwatch);
     }
 
     return radiogroup;
   },
@@ -129,17 +129,17 @@ let gContainersManager = {
 
       if (this.identity.color && this.identity.color == color) {
         colorSwatch.setAttribute("selected", true);
       }
 
       colorSwatch.setAttribute("label",
         containersBundle.GetStringFromName(`containers.${color}.label`));
       let iconElement = document.createElement("hbox");
-      iconElement.className = 'userContext-icon';
+      iconElement.className = "userContext-icon";
       iconElement.setAttribute("data-identity-icon", "circle");
       iconElement.setAttribute("data-identity-color", color);
 
       colorSwatch.appendChild(iconElement);
       radiogroup.appendChild(colorSwatch);
     }
     return radiogroup;
   },
--- a/browser/components/preferences/cookies.js
+++ b/browser/components/preferences/cookies.js
@@ -211,28 +211,28 @@ var gCookiesWindow = {
         return this._filterSet[aIndex];
 
       var start = 0;
       var count = 0, hostIndex = 0;
 
       var cacheIndex = Math.min(this._cacheValid, aIndex);
       if (cacheIndex > 0) {
         var cacheItem = this._cacheItems[cacheIndex];
-        start = cacheItem['start'];
-        count = hostIndex = cacheItem['count'];
+        start = cacheItem["start"];
+        count = hostIndex = cacheItem["count"];
       }
 
       for (let i = start; i < gCookiesWindow._hostOrder.length; ++i) { // var host in gCookiesWindow._hosts) {
         let currHost = gCookiesWindow._hosts[gCookiesWindow._hostOrder[i]];// gCookiesWindow._hosts[host];
         if (!currHost) continue;
         if (count == aIndex)
           return currHost;
         hostIndex = count;
 
-        var cacheEntry = { 'start' : i, 'count' : count };
+        var cacheEntry = { "start" : i, "count" : count };
         var cacheStart = count;
 
         if (currHost.open) {
           if (count < aIndex && aIndex <= (count + currHost.cookies.length)) {
             // We are looking for an entry within this host's children,
             // enumerate them looking for the index.
             ++count;
             for (let cookie of currHost.cookies) {
@@ -497,18 +497,18 @@ var gCookiesWindow = {
   },
 
   formatExpiresString(aExpires) {
     if (aExpires) {
       var date = new Date(1000 * aExpires);
       const locale = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                      .getService(Components.interfaces.nsIXULChromeRegistry)
                      .getSelectedLocale("global", true);
-      const dtOptions = { year: 'numeric', month: 'long', day: 'numeric',
-                          hour: 'numeric', minute: 'numeric', second: 'numeric' };
+      const dtOptions = { year: "numeric", month: "long", day: "numeric",
+                          hour: "numeric", minute: "numeric", second: "numeric" };
       return date.toLocaleString(locale, dtOptions);
     }
     return this._bundle.getString("expireAtEndOfSession");
   },
 
   _getUserContextString(aUserContextId) {
     if (parseInt(aUserContextId) == 0) {
       return this._bundle.getString("defaultUserContextLabel");
--- a/browser/components/preferences/in-content/applications.js
+++ b/browser/components/preferences/in-content/applications.js
@@ -1,18 +1,18 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 // Constants & Enumeration Values
 
-Components.utils.import('resource://gre/modules/Services.jsm');
-Components.utils.import('resource://gre/modules/AppConstants.jsm');
+Components.utils.import("resource://gre/modules/Services.jsm");
+Components.utils.import("resource://gre/modules/AppConstants.jsm");
 const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
 const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed";
 const TYPE_MAYBE_AUDIO_FEED = "application/vnd.mozilla.maybe.audio.feed";
 const TYPE_PDF = "application/pdf";
 
 const PREF_PDFJS_DISABLED = "pdfjs.disabled";
 const TOPIC_PDFJS_HANDLER_CHANGED = "pdfjs:handlerChanged";
 
--- a/browser/components/preferences/in-content/preferences.js
+++ b/browser/components/preferences/in-content/preferences.js
@@ -81,18 +81,18 @@ function init_all() {
   });
 
   window.addEventListener("hashchange", onHashChange);
   gotoPref();
 
   init_dynamic_padding();
 
   var initFinished = new CustomEvent("Initialized", {
-    'bubbles': true,
-    'cancelable': true
+    "bubbles": true,
+    "cancelable": true
   });
   document.dispatchEvent(initFinished);
 
   categories = categories.querySelectorAll("richlistitem.category");
   for (let category of categories) {
     let name = internalPrefCategoryNameToFriendlyName(category.value);
     let helpSelector = `#header-${name} > .help-button`;
     let helpButton = document.querySelector(helpSelector);
@@ -103,27 +103,27 @@ function init_all() {
   // notifying observers that the UI is now ready.
   Services.obs.notifyObservers(window, "advanced-pane-loaded", null);
 }
 
 // Make the space above the categories list shrink on low window heights
 function init_dynamic_padding() {
   let categories = document.getElementById("categories");
   let catPadding = Number.parseInt(getComputedStyle(categories)
-                                     .getPropertyValue('padding-top'));
+                                     .getPropertyValue("padding-top"));
   let fullHeight = categories.lastElementChild.getBoundingClientRect().bottom;
   let mediaRule = `
   @media (max-height: ${fullHeight}px) {
     #categories {
       padding-top: calc(100vh - ${fullHeight - catPadding}px);
     }
   }
   `;
-  let mediaStyle = document.createElementNS('http://www.w3.org/1999/xhtml', 'html:style');
-  mediaStyle.setAttribute('type', 'text/css');
+  let mediaStyle = document.createElementNS("http://www.w3.org/1999/xhtml", "html:style");
+  mediaStyle.setAttribute("type", "text/css");
   mediaStyle.appendChild(document.createCDATASection(mediaRule));
   document.documentElement.appendChild(mediaStyle);
 }
 
 function telemetryBucketForCategory(category) {
   switch (category) {
     case "general":
     case "search":
--- a/browser/components/preferences/in-content/privacy.js
+++ b/browser/components/preferences/in-content/privacy.js
@@ -405,57 +405,57 @@ var gPrivacyPane = {
 
   /**
    * Initialize the starting state for the auto-start private browsing mode pref reverter.
    */
   initAutoStartPrivateBrowsingReverter() {
     let mode = document.getElementById("historyMode");
     let autoStart = document.getElementById("privateBrowsingAutoStart");
     this._lastMode = mode.selectedIndex;
-    this._lastCheckState = autoStart.hasAttribute('checked');
+    this._lastCheckState = autoStart.hasAttribute("checked");
   },
 
   _lastMode: null,
   _lastCheckState: null,
   updateAutostart() {
       let mode = document.getElementById("historyMode");
       let autoStart = document.getElementById("privateBrowsingAutoStart");
       let pref = document.getElementById("browser.privatebrowsing.autostart");
       if ((mode.value == "custom" && this._lastCheckState == autoStart.checked) ||
           (mode.value == "remember" && !this._lastCheckState) ||
           (mode.value == "dontremember" && this._lastCheckState)) {
           // These are all no-op changes, so we don't need to prompt.
           this._lastMode = mode.selectedIndex;
-          this._lastCheckState = autoStart.hasAttribute('checked');
+          this._lastCheckState = autoStart.hasAttribute("checked");
           return;
       }
 
       if (!this._shouldPromptForRestart) {
         // We're performing a revert. Just let it happen.
         return;
       }
 
       let buttonIndex = confirmRestartPrompt(autoStart.checked, 1,
                                              true, false);
       if (buttonIndex == CONFIRM_RESTART_PROMPT_RESTART_NOW) {
-        pref.value = autoStart.hasAttribute('checked');
+        pref.value = autoStart.hasAttribute("checked");
         let appStartup = Cc["@mozilla.org/toolkit/app-startup;1"]
                            .getService(Ci.nsIAppStartup);
         appStartup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
         return;
       }
 
       this._shouldPromptForRestart = false;
 
       if (this._lastCheckState) {
         autoStart.checked = "checked";
       } else {
-        autoStart.removeAttribute('checked');
+        autoStart.removeAttribute("checked");
       }
-      pref.value = autoStart.hasAttribute('checked');
+      pref.value = autoStart.hasAttribute("checked");
       mode.selectedIndex = this._lastMode;
       mode.doCommand();
 
       this._shouldPromptForRestart = true;
   },
 
   /**
    * Displays fine-grained, per-site preferences for tracking protection.
--- a/browser/components/preferences/in-content/search.js
+++ b/browser/components/preferences/in-content/search.js
@@ -23,17 +23,17 @@ var gSearchPane = {
   },
 
   init() {
     gEngineView = new EngineView(new EngineStore());
     document.getElementById("engineList").view = gEngineView;
     this.buildDefaultEngineDropDown();
 
     let addEnginesLink = document.getElementById("addEngines");
-    let searchEnginesURL = Services.wm.getMostRecentWindow('navigator:browser')
+    let searchEnginesURL = Services.wm.getMostRecentWindow("navigator:browser")
                                       .BrowserSearch.searchEnginesURL;
     addEnginesLink.setAttribute("href", searchEnginesURL);
 
     window.addEventListener("click", this);
     window.addEventListener("command", this);
     window.addEventListener("dragstart", this);
     window.addEventListener("keypress", this);
     window.addEventListener("select", this);
--- a/browser/components/preferences/in-content/subdialogs.js
+++ b/browser/components/preferences/in-content/subdialogs.js
@@ -29,17 +29,17 @@ var gSubDialog = {
   updateTitle(aEvent) {
     if (aEvent.target != gSubDialog._frame.contentDocument)
       return;
     document.getElementById("dialogTitle").textContent = gSubDialog._frame.contentDocument.title;
   },
 
   injectXMLStylesheet(aStylesheetURL) {
     let contentStylesheet = this._frame.contentDocument.createProcessingInstruction(
-      'xml-stylesheet',
+      "xml-stylesheet",
       'href="' + aStylesheetURL + '" type="text/css"'
     );
     this._frame.contentDocument.insertBefore(contentStylesheet,
                                              this._frame.contentDocument.documentElement);
   },
 
   open(aURL, aFeatures = null, aParams = null, aClosingCallback = null) {
     // If we're already open/opening on this URL, do nothing.
@@ -266,17 +266,17 @@ var gSubDialog = {
                      "Please consider changing this.");
       comparisonFrameHeight = parseFloat(frameHeight);
     }
 
     if (comparisonFrameHeight > maxHeight) {
       // If the height is bigger than that of the window, we should let the contents scroll:
       frameHeight = maxHeight + "px";
       frameMinHeight = maxHeight + "px";
-      let containers = this._frame.contentDocument.querySelectorAll('.largeDialogContainer');
+      let containers = this._frame.contentDocument.querySelectorAll(".largeDialogContainer");
       for (let container of containers) {
         container.classList.add("doScroll");
       }
     }
 
     this._frame.style.height = frameHeight;
     this._box.style.minHeight = "calc(" +
                                 (boxVerticalBorder + groupBoxTitleHeight + boxVerticalPadding) +
--- a/browser/components/preferences/in-content/sync.js
+++ b/browser/components/preferences/in-content/sync.js
@@ -126,21 +126,21 @@ var gSyncPane = {
     }, this);
 
     window.addEventListener("unload", function() {
       topics.forEach(function(topic) {
         Weave.Svc.Obs.remove(topic, this.updateWeavePrefs, this);
       }, gSyncPane);
     });
 
-    XPCOMUtils.defineLazyGetter(this, '_stringBundle', () => {
+    XPCOMUtils.defineLazyGetter(this, "_stringBundle", () => {
       return Services.strings.createBundle("chrome://browser/locale/preferences/preferences.properties");
     });
 
-    XPCOMUtils.defineLazyGetter(this, '_accountsStringBundle', () => {
+    XPCOMUtils.defineLazyGetter(this, "_accountsStringBundle", () => {
       return Services.strings.createBundle("chrome://browser/locale/accounts.properties");
     });
 
     let url = Services.prefs.getCharPref("identity.mobilepromo.android") + "sync-preferences";
     document.getElementById("fxaMobilePromo-android").setAttribute("href", url);
     document.getElementById("fxaMobilePromo-android-hasFxaAccount").setAttribute("href", url);
     url = Services.prefs.getCharPref("identity.mobilepromo.ios") + "sync-preferences";
     document.getElementById("fxaMobilePromo-ios").setAttribute("href", url);
@@ -201,17 +201,17 @@ var gSyncPane = {
     }
 
     setEventListener("noAccountSetup", "click", function(aEvent) {
       aEvent.stopPropagation();
       gSyncPane.openSetup(null);
     });
     setEventListener("noAccountPair", "click", function(aEvent) {
       aEvent.stopPropagation();
-      gSyncPane.openSetup('pair');
+      gSyncPane.openSetup("pair");
     });
     setEventListener("syncChangePassword", "command",
       () => gSyncUtils.changePassword());
     setEventListener("syncResetPassphrase", "command",
       () => gSyncUtils.resetPassphrase());
     setEventListener("syncReset", "command", gSyncPane.resetSync);
     setEventListener("syncAddDeviceLabel", "click", function() {
       gSyncPane.openAddDevice();
--- a/browser/components/preferences/in-content/tests/browser_advanced_siteData.js
+++ b/browser/components/preferences/in-content/tests/browser_advanced_siteData.js
@@ -1,16 +1,16 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
 
-Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 /* import-globals-from ../../../../../testing/modules/sinon-1.16.1.js */
 Services.scriptloader.loadSubScript("resource://testing-common/sinon-1.16.1.js");
 
 const TEST_HOST = "example.com";
 const TEST_ORIGIN = "http://" + TEST_HOST;
 const TEST_BASE_URL = TEST_ORIGIN + "/browser/browser/components/preferences/in-content/tests/";
 
 const { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm", {});
--- a/browser/components/preferences/in-content/tests/browser_advanced_update.js
+++ b/browser/components/preferences/in-content/tests/browser_advanced_update.js
@@ -1,16 +1,16 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const { classes: Cc, interfaces: Ci, manager: Cm, utils: Cu, results: Cr } = Components;
 
-Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 const uuidGenerator = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator);
 
 const mockUpdateManager = {
   contractId: "@mozilla.org/updates/update-manager;1",
 
   _mockClassId: uuidGenerator.generateUUID(),
 
@@ -83,18 +83,18 @@ function resetPreferences() {
   Services.prefs.clearUserPref("browser.search.update");
 }
 
 function formatInstallDate(sec) {
   var date = new Date(sec);
   const locale = Cc["@mozilla.org/chrome/chrome-registry;1"]
                  .getService(Ci.nsIXULChromeRegistry)
                  .getSelectedLocale("global", true);
-  const dtOptions = { year: 'numeric', month: 'long', day: 'numeric',
-                      hour: 'numeric', minute: 'numeric', second: 'numeric' };
+  const dtOptions = { year: "numeric", month: "long", day: "numeric",
+                      hour: "numeric", minute: "numeric", second: "numeric" };
   return date.toLocaleString(locale, dtOptions);
 }
 
 registerCleanupFunction(resetPreferences);
 
 add_task(function*() {
   yield openPreferencesViaOpenPreferencesAPI("advanced", "updateTab", { leaveOpen: true });
   resetPreferences();
--- a/browser/components/preferences/in-content/tests/browser_bug410900.js
+++ b/browser/components/preferences/in-content/tests/browser_bug410900.js
@@ -31,16 +31,16 @@ function runTest(win) {
   var rbox = win.document.getElementById("handlersView");
   ok(rbox, "handlersView is present");
 
   var items = rbox && rbox.getElementsByTagName("richlistitem");
   ok(items && items.length > 0, "App handler list populated");
 
   var handlerAdded = false;
   for (let i = 0; i < items.length; i++) {
-    if (items[i].getAttribute('type') == "apppanetest")
+    if (items[i].getAttribute("type") == "apppanetest")
       handlerAdded = true;
   }
   ok(handlerAdded, "apppanetest protocol handler was successfully added");
 
   gBrowser.removeCurrentTab();
   finish();
 }
--- a/browser/components/preferences/in-content/tests/browser_privacypane_1.js
+++ b/browser/components/preferences/in-content/tests/browser_privacypane_1.js
@@ -1,16 +1,16 @@
 let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
              getService(Ci.mozIJSSubScriptLoader);
 
 let rootDir = getRootDirectory(gTestPath);
 let jar = getJar(rootDir);
 if (jar) {
   let tmpdir = extractJarToTmp(jar);
-  rootDir = "file://" + tmpdir.path + '/';
+  rootDir = "file://" + tmpdir.path + "/";
 }
 /* import-globals-from privacypane_tests_perwindow.js */
 loader.loadSubScript(rootDir + "privacypane_tests_perwindow.js", this);
 
 run_test_subset([
   test_pane_visibility,
   test_dependent_elements,
   test_dependent_cookie_elements,
--- a/browser/components/preferences/in-content/tests/browser_privacypane_3.js
+++ b/browser/components/preferences/in-content/tests/browser_privacypane_3.js
@@ -1,15 +1,15 @@
 let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
              getService(Ci.mozIJSSubScriptLoader);
 let rootDir = getRootDirectory(gTestPath);
 let jar = getJar(rootDir);
 if (jar) {
   let tmpdir = extractJarToTmp(jar);
-  rootDir = "file://" + tmpdir.path + '/';
+  rootDir = "file://" + tmpdir.path + "/";
 }
 /* import-globals-from privacypane_tests_perwindow.js */
 loader.loadSubScript(rootDir + "privacypane_tests_perwindow.js", this);
 
 run_test_subset([
   test_custom_retention("rememberHistory", "remember"),
   test_custom_retention("rememberHistory", "custom"),
   test_custom_retention("rememberForms", "custom"),
--- a/browser/components/preferences/in-content/tests/browser_privacypane_4.js
+++ b/browser/components/preferences/in-content/tests/browser_privacypane_4.js
@@ -1,17 +1,17 @@
 requestLongerTimeout(2);
 
 let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
              getService(Ci.mozIJSSubScriptLoader);
 let rootDir = getRootDirectory(gTestPath);
 let jar = getJar(rootDir);
 if (jar) {
   let tmpdir = extractJarToTmp(jar);
-  rootDir = "file://" + tmpdir.path + '/';
+  rootDir = "file://" + tmpdir.path + "/";
 }
 /* import-globals-from privacypane_tests_perwindow.js */
 loader.loadSubScript(rootDir + "privacypane_tests_perwindow.js", this);
 let runtime = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
 
 run_test_subset([
   test_custom_retention("acceptCookies", "remember"),
   test_custom_retention("acceptCookies", "custom"),
--- a/browser/components/preferences/in-content/tests/browser_privacypane_5.js
+++ b/browser/components/preferences/in-content/tests/browser_privacypane_5.js
@@ -1,15 +1,15 @@
 let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
              getService(Ci.mozIJSSubScriptLoader);
 let rootDir = getRootDirectory(gTestPath);
 let jar = getJar(rootDir);
 if (jar) {
   let tmpdir = extractJarToTmp(jar);
-  rootDir = "file://" + tmpdir.path + '/';
+  rootDir = "file://" + tmpdir.path + "/";
 }
 /* import-globals-from privacypane_tests_perwindow.js */
 loader.loadSubScript(rootDir + "privacypane_tests_perwindow.js", this);
 
 run_test_subset([
   test_locbar_suggestion_retention("history", true),
   test_locbar_suggestion_retention("bookmark", true),
   test_locbar_suggestion_retention("openpage", false),
--- a/browser/components/preferences/in-content/tests/browser_privacypane_8.js
+++ b/browser/components/preferences/in-content/tests/browser_privacypane_8.js
@@ -1,15 +1,15 @@
 let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
              getService(Ci.mozIJSSubScriptLoader);
 let rootDir = getRootDirectory(gTestPath);
 let jar = getJar(rootDir);
 if (jar) {
   let tmpdir = extractJarToTmp(jar);
-  rootDir = "file://" + tmpdir.path + '/';
+  rootDir = "file://" + tmpdir.path + "/";
 }
 /* import-globals-from privacypane_tests_perwindow.js */
 loader.loadSubScript(rootDir + "privacypane_tests_perwindow.js", this);
 
 run_test_subset([
   // history mode should be initialized to remember
   test_historymode_retention("remember", undefined),
 
--- a/browser/components/preferences/in-content/tests/browser_subdialogs.js
+++ b/browser/components/preferences/in-content/tests/browser_subdialogs.js
@@ -247,17 +247,17 @@ add_task(function* wrapped_text_in_dialo
   yield close_subdialog_and_test_generic_end_state(tab.linkedBrowser,
     function() { content.window.gSubDialog._frame.contentWindow.window.close(); },
     null, 0);
 });
 
 add_task(function* dialog_too_tall_should_get_reduced_in_height() {
   yield open_subdialog_and_test_generic_start_state(tab.linkedBrowser, function domcontentloadedFn() {
     let frame = content.window.gSubDialog._frame;
-    frame.contentDocument.documentElement.style.height = '100000px';
+    frame.contentDocument.documentElement.style.height = "100000px";
   });
 
   yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
     let frame = content.window.gSubDialog._frame;
     Assert.equal(frame.style.width, "32em", "Width should be set on the frame from the dialog");
     Assert.ok(parseInt(frame.style.height, 10) < content.window.innerHeight,
        "Height on the frame should be smaller than window's innerHeight");
   });
--- a/browser/components/search/test/browser_contextmenu.js
+++ b/browser/components/search/test/browser_contextmenu.js
@@ -71,17 +71,17 @@ add_task(function* () {
 
   let popupPromise = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
   BrowserTestUtils.synthesizeMouseAtCenter("body", eventDetails, gBrowser.selectedBrowser);
   yield popupPromise;
 
   info("checkContextMenu");
   var searchItem = contextMenu.getElementsByAttribute("id", "context-searchselect")[0];
   ok(searchItem, "Got search context menu item");
-  is(searchItem.label, 'Search ' + ENGINE_NAME + ' for \u201ctest search\u201d', "Check context menu label");
+  is(searchItem.label, "Search " + ENGINE_NAME + " for \u201ctest search\u201d", "Check context menu label");
   is(searchItem.disabled, false, "Check that search context menu item is enabled");
 
   yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
     searchItem.click();
   });
 
   is(gBrowser.currentURI.spec,
      "http://mochi.test:8888/browser/browser/components/search/test/?test=test+search&ie=utf-8&channel=contextsearch",
--- a/browser/components/search/test/head.js
+++ b/browser/components/search/test/head.js
@@ -4,17 +4,17 @@
 Cu.import("resource://gre/modules/Promise.jsm");
 
 /**
  * Recursively compare two objects and check that every property of expectedObj has the same value
  * on actualObj.
  */
 function isSubObjectOf(expectedObj, actualObj, name) {
   for (let prop in expectedObj) {
-    if (typeof expectedObj[prop] == 'function')
+    if (typeof expectedObj[prop] == "function")
       continue;
     if (expectedObj[prop] instanceof Object) {
       is(actualObj[prop].length, expectedObj[prop].length, name + "[" + prop + "]");
       isSubObjectOf(expectedObj[prop], actualObj[prop], name + "[" + prop + "]");
     } else {
       is(actualObj[prop], expectedObj[prop], name + "[" + prop + "]");
     }
   }
--- a/browser/components/syncedtabs/TabListView.js
+++ b/browser/components/syncedtabs/TabListView.js
@@ -112,17 +112,17 @@ TabListView.prototype = {
     this._updateSearchBox(state);
     for (let client of state.clients) {
       let clientNode = this._doc.getElementById("item-" + client.id);
       if (clientNode) {
         this._updateClient(client, clientNode);
       }
 
       client.tabs.forEach((tab, index) => {
-        let tabNode = this._doc.getElementById('tab-' + client.id + '-' + index);
+        let tabNode = this._doc.getElementById("tab-" + client.id + "-" + index);
         this._updateTab(tab, tabNode, index);
       });
     }
   },
 
   // Client rows are hidden when the list is filtered
   _renderFilteredClient(client, filter) {
     client.tabs.forEach((tab, index) => {
@@ -240,17 +240,17 @@ TabListView.prototype = {
   /**
    * Update the element representing a tab, ensuring it's in sync with the
    * underlying data.
    * @param {tab} item - Item to use as a source.
    * @param {Element} itemNode - Element to update.
    */
   _updateTab(item, itemNode, index) {
     itemNode.setAttribute("title", `${item.title}\n${item.url}`);
-    itemNode.setAttribute("id", "tab-" + item.client + '-' + index);
+    itemNode.setAttribute("id", "tab-" + item.client + "-" + index);
     if (item.selected) {
       itemNode.classList.add("selected");
     } else {
       itemNode.classList.remove("selected");
     }
     if (item.focused) {
       itemNode.focus();
     }
@@ -308,17 +308,17 @@ TabListView.prototype = {
   onKeyDown(event) {
     if (event.keyCode == this._window.KeyEvent.DOM_VK_DOWN) {
       event.preventDefault();
       this.props.onMoveSelectionDown();
     } else if (event.keyCode == this._window.KeyEvent.DOM_VK_UP) {
       event.preventDefault();
       this.props.onMoveSelectionUp();
     } else if (event.keyCode == this._window.KeyEvent.DOM_VK_RETURN) {
-      let selectedNode = this.container.querySelector('.item.selected');
+      let selectedNode = this.container.querySelector(".item.selected");
       if (selectedNode.dataset.url) {
         this.onOpenSelected(selectedNode.dataset.url, event);
       } else if (selectedNode) {
         this.props.onToggleBranch(selectedNode.dataset.id);
       }
     }
   },
 
@@ -376,25 +376,25 @@ TabListView.prototype = {
   onFilterFocus() {
     this.props.onFilterFocus();
   },
   onFilterBlur() {
     this.props.onFilterBlur();
   },
 
   _getSelectedTabNode() {
-    let item = this.container.querySelector('.item.selected');
+    let item = this.container.querySelector(".item.selected");
     if (this._isTab(item) && item.dataset.url) {
       return item;
     }
     return null;
   },
 
   _getSelectedClientNode() {
-    let item = this.container.querySelector('.item.selected');
+    let item = this.container.querySelector(".item.selected");
     if (this._isClient(item)) {
       return item;
     }
     return null;
   },
 
   // Set up the custom context menu
   _setupContextMenu() {
@@ -511,17 +511,17 @@ TabListView.prototype = {
       menu = getContextMenu(this._window);
       this.adjustContextMenu(menu);
     }
 
     menu.openPopupAtScreen(event.screenX, event.screenY, true, event);
   },
 
   adjustContextMenu(menu) {
-    let item = this.container.querySelector('.item.selected');
+    let item = this.container.querySelector(".item.selected");
     let showTabOptions = this._isTab(item);
 
     let el = menu.firstChild;
 
     while (el) {
       let show = false;
       if (showTabOptions) {
         if (el.getAttribute("id") != "syncedTabsOpenAllInTabs") {
--- a/browser/components/syncedtabs/test/browser/browser_sidebar_syncedtabslist.js
+++ b/browser/components/syncedtabs/test/browser/browser_sidebar_syncedtabslist.js
@@ -73,17 +73,17 @@ function* testClean() {
       window.SidebarUI.browser.contentWindow.removeEventListener("unload", listener);
       resolve();
     });
     SidebarUI.hide();
   });
 }
 
 add_task(function* testSyncedTabsSidebarList() {
-  yield SidebarUI.show('viewTabsSidebar');
+  yield SidebarUI.show("viewTabsSidebar");
 
   Assert.equal(SidebarUI.currentID, "viewTabsSidebar", "Sidebar should have SyncedTabs loaded");
 
   let syncedTabsDeckComponent = SidebarUI.browser.contentWindow.syncedTabsDeckComponent;
   let SyncedTabs = SidebarUI.browser.contentWindow.SyncedTabs;
 
   Assert.ok(syncedTabsDeckComponent, "component exists");
 
@@ -129,17 +129,17 @@ add_task(function* testSyncedTabsSidebar
     });
   });
 
 });
 
 add_task(testClean);
 
 add_task(function* testSyncedTabsSidebarFilteredList() {
-  yield SidebarUI.show('viewTabsSidebar');
+  yield SidebarUI.show("viewTabsSidebar");
   let syncedTabsDeckComponent = window.SidebarUI.browser.contentWindow.syncedTabsDeckComponent;
   let SyncedTabs = window.SidebarUI.browser.contentWindow.SyncedTabs;
 
   Assert.ok(syncedTabsDeckComponent, "component exists");
 
   originalSyncedTabsInternal = SyncedTabs._internal;
   SyncedTabs._internal = {
     isConfiguredToSyncTabs: true,
@@ -190,17 +190,17 @@ add_task(function* testSyncedTabsSidebar
   });
 });
 
 add_task(testClean);
 
 add_task(function* testSyncedTabsSidebarStatus() {
   let accountExists = false;
 
-  yield SidebarUI.show('viewTabsSidebar');
+  yield SidebarUI.show("viewTabsSidebar");
   let syncedTabsDeckComponent = window.SidebarUI.browser.contentWindow.syncedTabsDeckComponent;
   let SyncedTabs = window.SidebarUI.browser.contentWindow.SyncedTabs;
 
   originalSyncedTabsInternal = SyncedTabs._internal;
   SyncedTabs._internal = {
     isConfiguredToSyncTabs: false,
     hasSyncedThisSession: false,
     getTabClients() {},
@@ -251,17 +251,17 @@ add_task(function* testSyncedTabsSidebar
   selectedPanel = syncedTabsDeckComponent.container.querySelector(".sync-state.selected");
   Assert.ok(selectedPanel.classList.contains("tabs-container"),
     "tabs panel is selected");
 });
 
 add_task(testClean);
 
 add_task(function* testSyncedTabsSidebarContextMenu() {
-  yield SidebarUI.show('viewTabsSidebar');
+  yield SidebarUI.show("viewTabsSidebar");
   let syncedTabsDeckComponent = window.SidebarUI.browser.contentWindow.syncedTabsDeckComponent;
   let SyncedTabs = window.SidebarUI.browser.contentWindow.SyncedTabs;
 
   Assert.ok(syncedTabsDeckComponent, "component exists");
 
   originalSyncedTabsInternal = SyncedTabs._internal;
   SyncedTabs._internal = {
     isConfiguredToSyncTabs: true,
--- a/browser/components/syncedtabs/test/xpcshell/test_TabListComponent.js
+++ b/browser/components/syncedtabs/test/xpcshell/test_TabListComponent.js
@@ -22,18 +22,18 @@ const ACTION_METHODS = [
 
 add_task(function* testInitUninit() {
   let store = new SyncedTabsListStore();
   let ViewMock = sinon.stub();
   let view = {render() {}, destroy() {}};
 
   ViewMock.returns(view);
 
-  sinon.spy(view, 'render');
-  sinon.spy(view, 'destroy');
+  sinon.spy(view, "render");
+  sinon.spy(view, "destroy");
 
   sinon.spy(store, "on");
   sinon.stub(store, "getData");
   sinon.stub(store, "focusInput");
 
   let component = new TabListComponent({window, store, View: ViewMock, SyncedTabs});
 
   for (let action of ACTION_METHODS) {
--- a/browser/components/tests/browser/browser_bug538331.js
+++ b/browser/components/tests/browser/browser_bug538331.js
@@ -113,17 +113,17 @@ this.__defineGetter__("gBG", function() 
                     getService(Ci.nsIObserver);
 });
 
 function test() {
   waitForExplicitFinish();
 
   // Reset the startup page pref since it may have been set by other tests
   // and we will assume it is default.
-  Services.prefs.clearUserPref('browser.startup.page');
+  Services.prefs.clearUserPref("browser.startup.page");
 
   if (gPrefService.prefHasUserValue(PREF_MSTONE)) {
     gOriginalMStone = gPrefService.getCharPref(PREF_MSTONE);
   }
 
   if (gPrefService.prefHasUserValue(PREF_OVERRIDE_URL)) {
     gOriginalOverrideURL = gPrefService.getCharPref(PREF_OVERRIDE_URL);
   }
--- a/browser/components/translation/BingTranslator.jsm
+++ b/browser/components/translation/BingTranslator.jsm
@@ -295,33 +295,33 @@ BingRequest.prototype = {
       let url = getUrlParam("https://api.microsofttranslator.com/v2/Http.svc/TranslateArray",
                             "browser.translation.bing.translateArrayURL");
 
       // Prepare request headers.
       let headers = [["Content-type", "text/xml"], ["Authorization", auth]];
 
       // Prepare the request body.
       let requestString =
-        '<TranslateArrayRequest>' +
-          '<AppId/>' +
-          '<From>' + this.sourceLanguage + '</From>' +
-          '<Options>' +
+        "<TranslateArrayRequest>" +
+          "<AppId/>" +
+          "<From>" + this.sourceLanguage + "</From>" +
+          "<Options>" +
             '<ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/html</ContentType>' +
             '<ReservedFlags xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" />' +
-          '</Options>' +
+          "</Options>" +
           '<Texts xmlns:s="http://schemas.microsoft.com/2003/10/Serialization/Arrays">';
 
       for (let [, text] of this.translationData) {
-        requestString += '<s:string>' + text + '</s:string>';
+        requestString += "<s:string>" + text + "</s:string>";
         this.characterCount += text.length;
       }
 
-      requestString += '</Texts>' +
-          '<To>' + this.targetLanguage + '</To>' +
-        '</TranslateArrayRequest>';
+      requestString += "</Texts>" +
+          "<To>" + this.targetLanguage + "</To>" +
+        "</TranslateArrayRequest>";
 
       // Set up request options.
       let deferred = Promise.defer();
       let options = {
         onLoad: (function(responseText, xhr) {
           deferred.resolve(this);
         }).bind(this),
         onError(e, responseText, xhr) {
--- a/browser/components/translation/TranslationDocument.jsm
+++ b/browser/components/translation/TranslationDocument.jsm
@@ -170,17 +170,17 @@ this.TranslationDocument.prototype = {
         // Otherwise, if this node doesn't contain any useful content,
         // or if it is a root itself, we can replace it with a placeholder node.
         // We can't simply eliminate this node from our string representation
         // because that could change the HTML structure (e.g., it would
         // probably merge two separate text nodes).
         // It's not necessary to add more than one placeholder in sequence;
         // we can optimize them away.
         item.original.push(TranslationItem_NodePlaceholder);
-        str += '<br>';
+        str += "<br>";
         wasLastItemPlaceholder = true;
       }
     }
 
     return generateTranslationHtmlForItem(item, str);
   },
 
   /**
@@ -363,17 +363,17 @@ const TranslationItem_NodePlaceholder = 
  *
  * @param   item       A TranslationItem object.
  * param    content    The inner content for this item.
  * @returns string     The outer HTML needed for translation
  *                     of this item.
  */
 function generateTranslationHtmlForItem(item, content) {
   let localName = item.isRoot ? "div" : "b";
-  return '<' + localName + ' id=n' + item.id + '>' +
+  return "<" + localName + " id=n" + item.id + ">" +
          content +
          "</" + localName + ">";
 }
 
  /**
  * Regenerate the text string that represents a TranslationItem object,
  * with data from its "original" array. The array must have already
  * been created by TranslationDocument.generateTextForItem().
--- a/browser/components/translation/cld2/post.js
+++ b/browser/components/translation/cld2/post.js
@@ -10,162 +10,162 @@ LanguageInfo.detectLanguage = LanguageIn
 // Closure is overzealous in its function call optimization, and tries
 // to turn these singleton methods into unbound function calls.
 ensureCache.alloc = ensureCache.alloc.bind(ensureCache);
 ensureCache.prepare = ensureCache.prepare.bind(ensureCache);
 
 // From public/encodings.h. Unfortunately, the WebIDL binder doesn't
 // allow us to define or automatically derive these in the IDL.
 var Encodings = {
-  'ISO_8859_1'           :  0,
-  'ISO_8859_2'           :  1,
-  'ISO_8859_3'           :  2,
-  'ISO_8859_4'           :  3,
-  'ISO_8859_5'           :  4,
-  'ISO_8859_6'           :  5,
-  'ISO_8859_7'           :  6,
-  'ISO_8859_8'           :  7,
-  'ISO_8859_9'           :  8,
-  'ISO_8859_10'          :  9,
-  'JAPANESE_EUC_JP'      : 10,
-  'EUC_JP'               : 10,
-  'JAPANESE_SHIFT_JIS'   : 11,
-  'SHIFT_JIS'            : 11,
-  'JAPANESE_JIS'         : 12,
-  'JIS'                  : 12,
-  'CHINESE_BIG5'         : 13,
-  'BIG5'                 : 13,
-  'CHINESE_GB'           : 14,
-  'CHINESE_EUC_CN'       : 15,
-  'EUC_CN'               : 15,
-  'KOREAN_EUC_KR'        : 16,
-  'EUC_KR'               : 16,
-  'UNICODE_UNUSED'       : 17,
-  'CHINESE_EUC_DEC'      : 18,
-  'EUC_DEC'              : 18,
-  'CHINESE_CNS'          : 19,
-  'CNS'                  : 19,
-  'CHINESE_BIG5_CP950'   : 20,
-  'BIG5_CP950'           : 20,
-  'JAPANESE_CP932'       : 21,
-  'CP932'                : 21,
-  'UTF8'                 : 22,
-  'UNKNOWN_ENCODING'     : 23,
-  'ASCII_7BIT'           : 24,
-  'RUSSIAN_KOI8_R'       : 25,
-  'KOI8_R'               : 25,
-  'RUSSIAN_CP1251'       : 26,
-  'CP1251'               : 26,
-  'MSFT_CP1252'          : 27,
-  'CP1252'               : 27,
-  'RUSSIAN_KOI8_RU'      : 28,
-  'KOI8_RU'              : 28,
-  'MSFT_CP1250'          : 29,
-  'CP1250'               : 29,
-  'ISO_8859_15'          : 30,
-  'MSFT_CP1254'          : 31,
-  'CP1254'               : 31,
-  'MSFT_CP1257'          : 32,
-  'CP1257'               : 32,
-  'ISO_8859_11'          : 33,
-  'MSFT_CP874'           : 34,
-  'CP874'                : 34,
-  'MSFT_CP1256'          : 35,
-  'CP1256'               : 35,
-  'MSFT_CP1255'          : 36,
-  'CP1255'               : 36,
-  'ISO_8859_8_I'         : 37,
-  'HEBREW_VISUAL'        : 38,
-  'CZECH_CP852'          : 39,
-  'CP852'                : 39,
-  'CZECH_CSN_369103'     : 40,
-  'CSN_369103'           : 40,
-  'MSFT_CP1253'          : 41,
-  'CP1253'               : 41,
-  'RUSSIAN_CP866'        : 42,
-  'CP866'                : 42,
-  'ISO_8859_13'          : 43,
-  'ISO_2022_KR'          : 44,
-  'GBK'                  : 45,
-  'GB18030'              : 46,
-  'BIG5_HKSCS'           : 47,
-  'ISO_2022_CN'          : 48,
-  'TSCII'                : 49,
-  'TAMIL_MONO'           : 50,
-  'TAMIL_BI'             : 51,
-  'JAGRAN'               : 52,
-  'MACINTOSH_ROMAN'      : 53,
-  'UTF7'                 : 54,
-  'BHASKAR'              : 55,
-  'HTCHANAKYA'           : 56,
-  'UTF16BE'              : 57,
-  'UTF16LE'              : 58,
-  'UTF32BE'              : 59,
-  'UTF32LE'              : 60,
-  'BINARYENC'            : 61,
-  'HZ_GB_2312'           : 62,
-  'UTF8UTF8'             : 63,
-  'TAM_ELANGO'           : 64,
-  'TAM_LTTMBARANI'       : 65,
-  'TAM_SHREE'            : 66,
-  'TAM_TBOOMIS'          : 67,
-  'TAM_TMNEWS'           : 68,
-  'TAM_WEBTAMIL'         : 69,
-  'KDDI_SHIFT_JIS'       : 70,
-  'DOCOMO_SHIFT_JIS'     : 71,
-  'SOFTBANK_SHIFT_JIS'   : 72,
-  'KDDI_ISO_2022_JP'     : 73,
-  'ISO_2022_JP'          : 73,
-  'SOFTBANK_ISO_2022_JP' : 74,
+  "ISO_8859_1"           :  0,
+  "ISO_8859_2"           :  1,
+  "ISO_8859_3"           :  2,
+  "ISO_8859_4"           :  3,
+  "ISO_8859_5"           :  4,
+  "ISO_8859_6"           :  5,
+  "ISO_8859_7"           :  6,
+  "ISO_8859_8"           :  7,
+  "ISO_8859_9"           :  8,
+  "ISO_8859_10"          :  9,
+  "JAPANESE_EUC_JP"      : 10,
+  "EUC_JP"               : 10,
+  "JAPANESE_SHIFT_JIS"   : 11,
+  "SHIFT_JIS"            : 11,
+  "JAPANESE_JIS"         : 12,
+  "JIS"                  : 12,
+  "CHINESE_BIG5"         : 13,
+  "BIG5"                 : 13,
+  "CHINESE_GB"           : 14,
+  "CHINESE_EUC_CN"       : 15,
+  "EUC_CN"               : 15,
+  "KOREAN_EUC_KR"        : 16,
+  "EUC_KR"               : 16,
+  "UNICODE_UNUSED"       : 17,
+  "CHINESE_EUC_DEC"      : 18,
+  "EUC_DEC"              : 18,
+  "CHINESE_CNS"          : 19,
+  "CNS"                  : 19,
+  "CHINESE_BIG5_CP950"   : 20,
+  "BIG5_CP950"           : 20,
+  "JAPANESE_CP932"       : 21,
+  "CP932"                : 21,
+  "UTF8"                 : 22,
+  "UNKNOWN_ENCODING"     : 23,
+  "ASCII_7BIT"           : 24,
+  "RUSSIAN_KOI8_R"       : 25,
+  "KOI8_R"               : 25,
+  "RUSSIAN_CP1251"       : 26,
+  "CP1251"               : 26,
+  "MSFT_CP1252"          : 27,
+  "CP1252"               : 27,
+  "RUSSIAN_KOI8_RU"      : 28,
+  "KOI8_RU"              : 28,
+  "MSFT_CP1250"          : 29,
+  "CP1250"               : 29,
+  "ISO_8859_15"          : 30,
+  "MSFT_CP1254"          : 31,
+  "CP1254"               : 31,
+  "MSFT_CP1257"          : 32,
+  "CP1257"               : 32,
+  "ISO_8859_11"          : 33,
+  "MSFT_CP874"           : 34,
+  "CP874"                : 34,
+  "MSFT_CP1256"          : 35,
+  "CP1256"               : 35,
+  "MSFT_CP1255"          : 36,
+  "CP1255"               : 36,
+  "ISO_8859_8_I"         : 37,
+  "HEBREW_VISUAL"        : 38,
+  "CZECH_CP852"          : 39,
+  "CP852"                : 39,
+  "CZECH_CSN_369103"     : 40,
+  "CSN_369103"           : 40,
+  "MSFT_CP1253"          : 41,
+  "CP1253"               : 41,
+  "RUSSIAN_CP866"        : 42,
+  "CP866"                : 42,
+  "ISO_8859_13"          : 43,
+  "ISO_2022_KR"          : 44,
+  "GBK"                  : 45,
+  "GB18030"              : 46,
+  "BIG5_HKSCS"           : 47,
+  "ISO_2022_CN"          : 48,
+  "TSCII"                : 49,
+  "TAMIL_MONO"           : 50,
+  "TAMIL_BI"             : 51,
+  "JAGRAN"               : 52,
+  "MACINTOSH_ROMAN"      : 53,
+  "UTF7"                 : 54,
+  "BHASKAR"              : 55,
+  "HTCHANAKYA"           : 56,
+  "UTF16BE"              : 57,
+  "UTF16LE"              : 58,
+  "UTF32BE"              : 59,
+  "UTF32LE"              : 60,
+  "BINARYENC"            : 61,
+  "HZ_GB_2312"           : 62,
+  "UTF8UTF8"             : 63,
+  "TAM_ELANGO"           : 64,
+  "TAM_LTTMBARANI"       : 65,
+  "TAM_SHREE"            : 66,
+  "TAM_TBOOMIS"          : 67,
+  "TAM_TMNEWS"           : 68,
+  "TAM_WEBTAMIL"         : 69,
+  "KDDI_SHIFT_JIS"       : 70,
+  "DOCOMO_SHIFT_JIS"     : 71,
+  "SOFTBANK_SHIFT_JIS"   : 72,
+  "KDDI_ISO_2022_JP"     : 73,
+  "ISO_2022_JP"          : 73,
+  "SOFTBANK_ISO_2022_JP" : 74,
 };
 
 // Accept forms both with and without underscores/hypens.
 for (let code of Object.keys(Encodings)) {
-  if (code['includes']("_"))
+  if (code["includes"]("_"))
     Encodings[code.replace(/_/g, "")] = Encodings[code];
 }
 
 addOnPreMain(function() {
 
   onmessage = function(aMsg) {
-    let data = aMsg['data'];
+    let data = aMsg["data"];
 
     let langInfo;
-    if (data['tld'] == undefined && data['encoding'] == undefined && data['language'] == undefined) {
-      langInfo = LanguageInfo.detectLanguage(data['text'], !data['isHTML']);
+    if (data["tld"] == undefined && data["encoding"] == undefined && data["language"] == undefined) {
+      langInfo = LanguageInfo.detectLanguage(data["text"], !data["isHTML"]);
     } else {
       // Do our best to find the given encoding in the encodings table.
       // Otherwise, just fall back to unknown.
-      let enc = String(data['encoding']).toUpperCase().replace(/[_-]/g, "");
+      let enc = String(data["encoding"]).toUpperCase().replace(/[_-]/g, "");
 
       let encoding;
       if (Encodings.hasOwnProperty(enc))
         encoding = Encodings[enc];
       else
-        encoding = Encodings['UNKNOWN_ENCODING'];
+        encoding = Encodings["UNKNOWN_ENCODING"];
 
-      langInfo = LanguageInfo.detectLanguage(data['text'], !data['isHTML'],
-                                             data['tld'] || null,
+      langInfo = LanguageInfo.detectLanguage(data["text"], !data["isHTML"],
+                                             data["tld"] || null,
                                              encoding,
-                                             data['language'] || null);
+                                             data["language"] || null);
     }
 
     postMessage({
-      'language': langInfo.getLanguageCode(),
-      'confident': langInfo.getIsReliable(),
+      "language": langInfo.getLanguageCode(),
+      "confident": langInfo.getIsReliable(),
 
-      'languages': new Array(3).fill(0).map((_, index) => {
+      "languages": new Array(3).fill(0).map((_, index) => {
         let lang = langInfo.get_languages(index);
         return {
-          'languageCode': lang.getLanguageCode(),
-          'percent': lang.getPercent(),
+          "languageCode": lang.getLanguageCode(),
+          "percent": lang.getPercent(),
         };
       }).filter(lang => {
         // Ignore empty results.
-        return lang['languageCode'] != "un" || lang['percent'] > 0;
+        return lang["languageCode"] != "un" || lang["percent"] > 0;
       }),
     });
 
     Module.destroy(langInfo);
   };
 
   postMessage("ready");
 });
--- a/browser/components/translation/test/browser_translation_telemetry.js
+++ b/browser/components/translation/test/browser_translation_telemetry.js
@@ -64,17 +64,17 @@ var MetricsChecker = {
 
   /**
    * A recurrent loop for making assertions about collected metrics.
    */
   _assertionLoop(prevMetrics, metrics, additions) {
     for (let metric of Object.keys(additions)) {
       let addition = additions[metric];
       // Allows nesting metrics. Useful for keyed histograms.
-      if (typeof addition === 'object') {
+      if (typeof addition === "object") {
         this._assertionLoop(prevMetrics[metric], metrics[metric], addition);
         continue;
       }
       Assert.equal(prevMetrics[metric] + addition, metrics[metric]);
     }
   },
 
   checkAdditions(additions) {
--- a/browser/components/translation/translation-infobar.xml
+++ b/browser/components/translation/translation-infobar.xml
@@ -151,17 +151,17 @@
                            oncommand="document.getBindingParent(this).closeCommand();"/>
       </xul:hbox>
     </content>
     <implementation>
       <property name="state"
                 onget="return this._getAnonElt('translationStates').selectedIndex;">
         <setter>
           <![CDATA[
-          let deck = this._getAnonElt('translationStates');
+          let deck = this._getAnonElt("translationStates");
 
           let activeElt = document.activeElement;
           if (activeElt && deck.contains(activeElt))
             activeElt.blur();
 
           let stateName;
           for (let name of ["OFFER", "TRANSLATING", "TRANSLATED", "ERROR"]) {
             if (Translation["STATE_" + name] == val) {
@@ -219,17 +219,17 @@
 
             if (aTranslation.state)
               this.state = aTranslation.state;
 
             // Show attribution for the preferred translator.
             let engineIndex = Object.keys(Translation.supportedEngines)
               .indexOf(Translation.translationEngine);
             if (engineIndex != -1) {
-              this._getAnonElt('translationEngine').selectedIndex = engineIndex;
+              this._getAnonElt("translationEngine").selectedIndex = engineIndex;
             }
 
             const kWelcomePref = "browser.translation.ui.welcomeMessageShown";
             if (Services.prefs.prefHasUserValue(kWelcomePref) ||
                 this.translation.browser != gBrowser.selectedBrowser)
               return;
 
             this.addEventListener("transitionend", function onShown() {
--- a/browser/components/uitour/UITour-lib.js
+++ b/browser/components/uitour/UITour-lib.js
@@ -1,104 +1,104 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 // create namespace
-if (typeof Mozilla == 'undefined') {
+if (typeof Mozilla == "undefined") {
   var Mozilla = {};
 }
 
 (function($) {
-  'use strict';
+  "use strict";
 
   // create namespace
-  if (typeof Mozilla.UITour == 'undefined') {
+  if (typeof Mozilla.UITour == "undefined") {
     Mozilla.UITour = {};
   }
 
   var themeIntervalId = null;
   function _stopCyclingThemes() {
     if (themeIntervalId) {
       clearInterval(themeIntervalId);
       themeIntervalId = null;
     }
   }
 
   function _sendEvent(action, data) {
-    var event = new CustomEvent('mozUITour', {
+    var event = new CustomEvent("mozUITour", {
       bubbles: true,
       detail: {
 	action,
 	data: data || {}
       }
     });
 
     document.dispatchEvent(event);
   }
 
   function _generateCallbackID() {
-    return Math.random().toString(36).replace(/[^a-z]+/g, '');
+    return Math.random().toString(36).replace(/[^a-z]+/g, "");
   }
 
   function _waitForCallback(callback) {
     var id = _generateCallbackID();
 
     function listener(event) {
-      if (typeof event.detail != 'object')
+      if (typeof event.detail != "object")
 	return;
       if (event.detail.callbackID != id)
 	return;
 
-      document.removeEventListener('mozUITourResponse', listener);
+      document.removeEventListener("mozUITourResponse", listener);
       callback(event.detail.data);
     }
-    document.addEventListener('mozUITourResponse', listener);
+    document.addEventListener("mozUITourResponse", listener);
 
     return id;
   }
 
   var notificationListener = null;
   function _notificationListener(event) {
-    if (typeof event.detail != 'object')
+    if (typeof event.detail != "object")
       return;
-    if (typeof notificationListener != 'function')
+    if (typeof notificationListener != "function")
       return;
 
     notificationListener(event.detail.event, event.detail.params);
   }
 
   Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY = 10 * 1000;
 
-  Mozilla.UITour.CONFIGNAME_SYNC = 'sync';
-  Mozilla.UITour.CONFIGNAME_AVAILABLETARGETS = 'availableTargets';
+  Mozilla.UITour.CONFIGNAME_SYNC = "sync";
+  Mozilla.UITour.CONFIGNAME_AVAILABLETARGETS = "availableTargets";
 
   Mozilla.UITour.ping = function(callback) {
     var data = {};
     if (callback) {
       data.callbackID = _waitForCallback(callback);
     }
-    _sendEvent('ping', data);
+    _sendEvent("ping", data);
   };
 
   Mozilla.UITour.observe = function(listener, callback) {
     notificationListener = listener;
 
     if (listener) {
-      document.addEventListener('mozUITourNotification',
+      document.addEventListener("mozUITourNotification",
                                 _notificationListener);
       Mozilla.UITour.ping(callback);
     } else {
-      document.removeEventListener('mozUITourNotification',
+      document.removeEventListener("mozUITourNotification",
                                    _notificationListener);
     }
   };
 
   Mozilla.UITour.registerPageID = function(pageID) {
-    _sendEvent('registerPageID', {
+    _sendEvent("registerPageID", {
       pageID
     });
   };
 
   Mozilla.UITour.showHeartbeat = function(message, thankyouMessage, flowId, engagementURL,
 					  learnMoreLabel, learnMoreURL, options) {
     var args = {
       message,
@@ -113,28 +113,28 @@ if (typeof Mozilla == 'undefined') {
       for (var option in options) {
 	if (!options.hasOwnProperty(option)) {
 	  continue;
 	}
 	args[option] = options[option];
       }
     }
 
-    _sendEvent('showHeartbeat', args);
+    _sendEvent("showHeartbeat", args);
   };
 
   Mozilla.UITour.showHighlight = function(target, effect) {
-    _sendEvent('showHighlight', {
+    _sendEvent("showHighlight", {
       target,
       effect
     });
   };
 
   Mozilla.UITour.hideHighlight = function() {
-    _sendEvent('hideHighlight');
+    _sendEvent("hideHighlight");
   };
 
   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,
@@ -146,186 +146,186 @@ if (typeof Mozilla == 'undefined') {
     }
 
     var closeButtonCallbackID, targetCallbackID;
     if (options && options.closeButtonCallback)
       closeButtonCallbackID = _waitForCallback(options.closeButtonCallback);
     if (options && options.targetCallback)
       targetCallbackID = _waitForCallback(options.targetCallback);
 
-    _sendEvent('showInfo', {
+    _sendEvent("showInfo", {
       target,
       title,
       text,
       icon,
       buttons: buttonData,
       closeButtonCallbackID,
       targetCallbackID
     });
   };
 
   Mozilla.UITour.hideInfo = function() {
-    _sendEvent('hideInfo');
+    _sendEvent("hideInfo");
   };
 
   Mozilla.UITour.previewTheme = function(theme) {
     _stopCyclingThemes();
 
-    _sendEvent('previewTheme', {
+    _sendEvent("previewTheme", {
       theme: JSON.stringify(theme)
     });
   };
 
   Mozilla.UITour.resetTheme = function() {
     _stopCyclingThemes();
 
-    _sendEvent('resetTheme');
+    _sendEvent("resetTheme");
   };
 
   Mozilla.UITour.cycleThemes = function(themes, delay, callback) {
     _stopCyclingThemes();
 
     if (!delay) {
       delay = Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY;
     }
 
     function nextTheme() {
       var theme = themes.shift();
       themes.push(theme);
 
-      _sendEvent('previewTheme', {
+      _sendEvent("previewTheme", {
 	theme: JSON.stringify(theme),
 	state: true
       });
 
       callback(theme);
     }
 
     themeIntervalId = setInterval(nextTheme, delay);
     nextTheme();
   };
 
   Mozilla.UITour.showMenu = function(name, callback) {
     var showCallbackID;
     if (callback)
       showCallbackID = _waitForCallback(callback);
 
-    _sendEvent('showMenu', {
+    _sendEvent("showMenu", {
       name,
       showCallbackID,
     });
   };
 
   Mozilla.UITour.hideMenu = function(name) {
-    _sendEvent('hideMenu', {
+    _sendEvent("hideMenu", {
       name
     });
   };
 
   Mozilla.UITour.showNewTab = function() {
-    _sendEvent('showNewTab');
+    _sendEvent("showNewTab");
   };
 
   Mozilla.UITour.getConfiguration = function(configName, callback) {
-    _sendEvent('getConfiguration', {
+    _sendEvent("getConfiguration", {
       callbackID: _waitForCallback(callback),
       configuration: configName,
     });
   };
 
   Mozilla.UITour.setConfiguration = function(configName, configValue) {
-    _sendEvent('setConfiguration', {
+    _sendEvent("setConfiguration", {
       configuration: configName,
       value: configValue,
     });
   };
 
   /**
    * Request the browser open the Firefox Accounts page.
    *
    * @param {Object} extraURLCampaignParams - An object containing additional
    * paramaters for the URL opened by the browser for reasons of promotional
    * campaign tracking. Each attribute of the object must have a name that
    * is a string, begins with "utm_" and contains only only alphanumeric
    * characters, dashes or underscores. The values may be any string and will
    * automatically be encoded.
    */
   Mozilla.UITour.showFirefoxAccounts = function(extraURLCampaignParams) {
-    _sendEvent('showFirefoxAccounts', {
+    _sendEvent("showFirefoxAccounts", {
       extraURLCampaignParams: JSON.stringify(extraURLCampaignParams),
     });
   };
 
   Mozilla.UITour.resetFirefox = function() {
-    _sendEvent('resetFirefox');
+    _sendEvent("resetFirefox");
   };
 
   Mozilla.UITour.addNavBarWidget = function(name, callback) {
-    _sendEvent('addNavBarWidget', {
+    _sendEvent("addNavBarWidget", {
       name,
       callbackID: _waitForCallback(callback),
     });
   };
 
   Mozilla.UITour.setDefaultSearchEngine = function(identifier) {
-    _sendEvent('setDefaultSearchEngine', {
+    _sendEvent("setDefaultSearchEngine", {
       identifier,
     });
   };
 
   Mozilla.UITour.setTreatmentTag = function(name, value) {
-    _sendEvent('setTreatmentTag', {
+    _sendEvent("setTreatmentTag", {
       name,
       value
     });
   };
 
   Mozilla.UITour.getTreatmentTag = function(name, callback) {
-    _sendEvent('getTreatmentTag', {
+    _sendEvent("getTreatmentTag", {
       name,
       callbackID: _waitForCallback(callback)
     });
   };
 
   Mozilla.UITour.setSearchTerm = function(term) {
-    _sendEvent('setSearchTerm', {
+    _sendEvent("setSearchTerm", {
       term
     });
   };
 
   Mozilla.UITour.openSearchPanel = function(callback) {
-    _sendEvent('openSearchPanel', {
+    _sendEvent("openSearchPanel", {
       callbackID: _waitForCallback(callback)
     });
   };
 
   Mozilla.UITour.forceShowReaderIcon = function() {
-    _sendEvent('forceShowReaderIcon');
+    _sendEvent("forceShowReaderIcon");
   };
 
   Mozilla.UITour.toggleReaderMode = function() {
-    _sendEvent('toggleReaderMode');
+    _sendEvent("toggleReaderMode");
   };
 
   Mozilla.UITour.openPreferences = function(pane) {
-    _sendEvent('openPreferences', {
+    _sendEvent("openPreferences", {
       pane
     });
   };
 
   /**
    * Closes the tab where this code is running. As usual, if the tab is in the
    * foreground, the tab that was displayed before is selected.
    *
    * The last tab in the current window will never be closed, in which case
    * this call will have no effect. The calling code is expected to take an
    * action after a small timeout in order to handle this case, for example by
    * displaying a goodbye message or a button to restart the tour.
    */
   Mozilla.UITour.closeTab = function() {
-    _sendEvent('closeTab');
+    _sendEvent("closeTab");
   };
 })();
 
 // Make this library Require-able.
-if (typeof module !== 'undefined' && module.exports) {
+if (typeof module !== "undefined" && module.exports) {
   module.exports = Mozilla.UITour;
 }
--- a/browser/components/uitour/test/browser_UITour_heartbeat.js
+++ b/browser/components/uitour/test/browser_UITour_heartbeat.js
@@ -180,25 +180,25 @@ add_UITour_task(function* test_heartbeat
     ["Heartbeat:NotificationOffered", "Heartbeat:NotificationClosed", "Heartbeat:TelemetrySent"]);
 
   // Show the Heartbeat notification and wait for it to be displayed.
   let shownPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationOffered");
   gContentAPI.showHeartbeat("How would you rate Firefox?", "Thank you!", flowId, engagementURL);
 
   // Validate the returned timestamp.
   let data = yield shownPromise;
-  validateTimestamp('Heartbeat:Offered', data.timestamp);
+  validateTimestamp("Heartbeat:Offered", data.timestamp);
 
   // Close the heartbeat notification.
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let pingSentPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
   cleanUpNotification(flowId);
 
   data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
 
   data = yield pingSentPromise;
   info("'Heartbeat:TelemetrySent' notification received");
   checkTelemetry(data, flowId, ["offeredTS", "closedTS"]);
 
   // This rejects whenever an unexpected notification is received.
   yield receivedExpectedPromise;
 })
@@ -221,29 +221,29 @@ add_UITour_task(function* test_heartbeat
   // Show the Heartbeat notification and wait for it to be displayed.
   let shownPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationOffered");
   gContentAPI.showHeartbeat("How would you rate Firefox?", "Thank you!", flowId, engagementURL, null, null, {
     iconURL
   });
 
   // Validate the returned timestamp.
   let data = yield shownPromise;
-  validateTimestamp('Heartbeat:Offered', data.timestamp);
+  validateTimestamp("Heartbeat:Offered", data.timestamp);
 
   // Check the icon URL
   let notification = getHeartbeatNotification(flowId);
   is(notification.image, iconURL, "The optional icon URL is not taken correctly");
 
   // Close the heartbeat notification.
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let pingSentPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
   cleanUpNotification(flowId);
 
   data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
 
   data = yield pingSentPromise;
   info("'Heartbeat:TelemetrySent' notification received");
   checkTelemetry(data, flowId, ["offeredTS", "closedTS"]);
 
   // This rejects whenever an unexpected notification is received.
   yield receivedExpectedPromise;
 })
@@ -263,32 +263,32 @@ add_UITour_task(function* test_heartbeat
     "Heartbeat:NotificationClosed", "Heartbeat:Voted", "Heartbeat:TelemetrySent"]);
 
   // Show the Heartbeat notification and wait for it to be displayed.
   let shownPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationOffered");
   gContentAPI.showHeartbeat("How would you rate Firefox?", "Thank you!", flowId, null);
 
   // Validate the returned timestamp.
   let data = yield shownPromise;
-  validateTimestamp('Heartbeat:Offered', data.timestamp);
+  validateTimestamp("Heartbeat:Offered", data.timestamp);
 
   // Wait an the Voted, Closed and Telemetry Sent events. They are fired together, so
   // wait for them here.
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let votedPromise = promiseWaitHeartbeatNotification("Heartbeat:Voted");
   let pingSentPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
 
   // The UI was just shown. We can simulate a click on a rating element (i.e., "star").
   simulateVote(flowId, 2);
   data = yield votedPromise;
-  validateTimestamp('Heartbeat:Voted', data.timestamp);
+  validateTimestamp("Heartbeat:Voted", data.timestamp);
 
   // Validate the closing timestamp.
   data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
   is(gBrowser.tabs.length, originalTabCount, "No engagement tab should be opened.");
 
   // Validate the data we send out.
   data = yield pingSentPromise;
   info("'Heartbeat:TelemetrySent' notification received.");
   checkTelemetry(data, flowId, ["offeredTS", "votedTS", "closedTS", "score"]);
   is(data.score, 2, "Checking Telemetry payload.score");
 
@@ -312,32 +312,32 @@ add_UITour_task(function* test_heartbeat
     "Heartbeat:NotificationClosed", "Heartbeat:Voted", "Heartbeat:TelemetrySent"]);
 
   // Show the Heartbeat notification and wait for it to be displayed.
   let shownPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationOffered");
   gContentAPI.showHeartbeat("How would you rate Firefox?", "Thank you!", flowId, invalidEngagementURL);
 
   // Validate the returned timestamp.
   let data = yield shownPromise;
-  validateTimestamp('Heartbeat:Offered', data.timestamp);
+  validateTimestamp("Heartbeat:Offered", data.timestamp);
 
   // Wait an the Voted, Closed and Telemetry Sent events. They are fired together, so
   // wait for them here.
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let votedPromise = promiseWaitHeartbeatNotification("Heartbeat:Voted");
   let pingSentPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
 
   // The UI was just shown. We can simulate a click on a rating element (i.e., "star").
   simulateVote(flowId, 2);
   data = yield votedPromise;
-  validateTimestamp('Heartbeat:Voted', data.timestamp);
+  validateTimestamp("Heartbeat:Voted", data.timestamp);
 
   // Validate the closing timestamp.
   data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
   is(gBrowser.tabs.length, originalTabCount, "No engagement tab should be opened.");
 
   // Validate the data we send out.
   data = yield pingSentPromise;
   info("'Heartbeat:TelemetrySent' notification received.");
   checkTelemetry(data, flowId, ["offeredTS", "votedTS", "closedTS", "score"]);
   is(data.score, 2, "Checking Telemetry payload.score");
 
@@ -361,33 +361,33 @@ add_UITour_task(function* test_heartbeat
     "Heartbeat:NotificationClosed", "Heartbeat:Voted", "Heartbeat:TelemetrySent"]);
 
   // Show the Heartbeat notification and wait for it to be displayed.
   let shownPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationOffered");
   gContentAPI.showHeartbeat("How would you rate Firefox?", "Thank you!", flowId, null);
 
   // Validate the returned timestamp.
   let data = yield shownPromise;
-  validateTimestamp('Heartbeat:Offered', data.timestamp);
+  validateTimestamp("Heartbeat:Offered", data.timestamp);
 
   // Wait an the Voted, Closed and Telemetry Sent events. They are fired together, so
   // wait for them here.
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let votedPromise = promiseWaitHeartbeatNotification("Heartbeat:Voted");
   let pingSentPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
 
   // The UI was just shown. We can simulate a click on a rating element (i.e., "star").
   simulateVote(flowId, expectedScore);
   data = yield votedPromise;
-  validateTimestamp('Heartbeat:Voted', data.timestamp);
+  validateTimestamp("Heartbeat:Voted", data.timestamp);
   is(data.score, expectedScore, "Should report a score of " + expectedScore);
 
   // Validate the closing timestamp and vote.
   data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
   is(gBrowser.tabs.length, originalTabCount, "No engagement tab should be opened.");
 
   // Validate the data we send out.
   data = yield pingSentPromise;
   info("'Heartbeat:TelemetrySent' notification received.");
   checkTelemetry(data, flowId, ["offeredTS", "votedTS", "closedTS", "score"]);
   is(data.score, expectedScore, "Checking Telemetry payload.score");
 
@@ -412,32 +412,32 @@ add_UITour_task(function* test_heartbeat
     "Heartbeat:NotificationClosed", "Heartbeat:Voted", "Heartbeat:TelemetrySent"]);
 
   // Show the Heartbeat notification and wait for it to be displayed.
   let shownPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationOffered");
   gContentAPI.showHeartbeat("How would you rate Firefox?", "Thank you!", flowId, engagementURL);
 
   // Validate the returned timestamp.
   let data = yield shownPromise;
-  validateTimestamp('Heartbeat:Offered', data.timestamp);
+  validateTimestamp("Heartbeat:Offered", data.timestamp);
 
   // Wait an the Voted, Closed and Telemetry Sent events. They are fired together, so
   // wait for them here.
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let votedPromise = promiseWaitHeartbeatNotification("Heartbeat:Voted");
   let pingSentPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
 
   // The UI was just shown. We can simulate a click on a rating element (i.e., "star").
   simulateVote(flowId, 1);
   data = yield votedPromise;
-  validateTimestamp('Heartbeat:Voted', data.timestamp);
+  validateTimestamp("Heartbeat:Voted", data.timestamp);
 
   // Validate the closing timestamp, vote and make sure the engagement page was opened.
   data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
   is(gBrowser.tabs.length, expectedTabCount, "Engagement URL should open in a new tab.");
   gBrowser.removeCurrentTab();
 
   // Validate the data we send out.
   data = yield pingSentPromise;
   info("'Heartbeat:TelemetrySent' notification received.");
   checkTelemetry(data, flowId, ["offeredTS", "votedTS", "closedTS", "score"]);
   is(data.score, 1, "Checking Telemetry payload.score");
@@ -464,38 +464,38 @@ add_UITour_task(function* test_heartbeat
 
   // Show the Heartbeat notification and wait for it to be displayed.
   let shownPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationOffered");
   gContentAPI.showHeartbeat("Do you want to engage with us?", "Thank you!", flowId, engagementURL, null, null, {
     engagementButtonLabel: "Engage Me",
   });
 
   let data = yield shownPromise;
-  validateTimestamp('Heartbeat:Offered', data.timestamp);
+  validateTimestamp("Heartbeat:Offered", data.timestamp);
 
   // Wait an the Engaged, Closed and Telemetry Sent events. They are fired together, so
   // wait for them here.
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let engagedPromise = promiseWaitHeartbeatNotification("Heartbeat:Engaged");
   let pingSentPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
 
   // Simulate user engagement.
   let notification = getHeartbeatNotification(flowId);
   is(notification.querySelectorAll(".star-x").length, 0, "No stars should be present");
   // The UI was just shown. We can simulate a click on the engagement button.
   let engagementButton = notification.querySelector(".notification-button");
   is(engagementButton.label, "Engage Me", "Check engagement button text");
   engagementButton.doCommand();
 
   data = yield engagedPromise;
-  validateTimestamp('Heartbeat:Engaged', data.timestamp);
+  validateTimestamp("Heartbeat:Engaged", data.timestamp);
 
   // Validate the closing timestamp, vote and make sure the engagement page was opened.
   data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
   is(gBrowser.tabs.length, expectedTabCount, "Engagement URL should open in a new tab.");
   gBrowser.removeCurrentTab();
 
   // Validate the data we send out.
   data = yield pingSentPromise;
   info("'Heartbeat:TelemetrySent' notification received.");
   checkTelemetry(data, flowId, ["offeredTS", "engagedTS", "closedTS"]);
 
@@ -521,34 +521,34 @@ add_UITour_task(function* test_heartbeat
     "Heartbeat:NotificationClosed", "Heartbeat:LearnMore", "Heartbeat:TelemetrySent"]);
 
   // Show the Heartbeat notification and wait for it to be displayed.
   let shownPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationOffered");
   gContentAPI.showHeartbeat("How would you rate Firefox?", "Thank you!", flowId, dummyURL,
                             "What is this?", dummyURL);
 
   let data = yield shownPromise;
-  validateTimestamp('Heartbeat:Offered', data.timestamp);
+  validateTimestamp("Heartbeat:Offered", data.timestamp);
 
   // Wait an the LearnMore, Closed and Telemetry Sent events. They are fired together, so
   // wait for them here.
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let learnMorePromise = promiseWaitHeartbeatNotification("Heartbeat:LearnMore");
   let pingSentPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
 
   // The UI was just shown. Simulate a click on the learn more link.
   clickLearnMore(flowId);
 
   data = yield learnMorePromise;
-  validateTimestamp('Heartbeat:LearnMore', data.timestamp);
+  validateTimestamp("Heartbeat:LearnMore", data.timestamp);
   cleanUpNotification(flowId);
 
   // The notification was closed.
   data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
   is(gBrowser.tabs.length, expectedTabCount, "Learn more URL should open in a new tab.");
   gBrowser.removeCurrentTab();
 
   // Validate the data we send out.
   data = yield pingSentPromise;
   info("'Heartbeat:TelemetrySent' notification received.");
   checkTelemetry(data, flowId, ["offeredTS", "learnMoreTS", "closedTS"]);
 
@@ -732,17 +732,17 @@ add_UITour_task(function* test_telemetry
   yield shownPromise;
 
   let closedPromise = promiseWaitHeartbeatNotification("Heartbeat:NotificationClosed");
   let pingPromise = promiseWaitHeartbeatNotification("Heartbeat:TelemetrySent");
   cleanUpNotification(flowId);
 
   // The notification was closed.
   let data = yield closedPromise;
-  validateTimestamp('Heartbeat:NotificationClosed', data.timestamp);
+  validateTimestamp("Heartbeat:NotificationClosed", data.timestamp);
 
   // Validate the data we send out.
   data = yield pingPromise;
   info("'Heartbeat:TelemetrySent' notification received.");
   checkTelemetry(data, flowId, ["offeredTS", "closedTS"].concat(expectedFields));
   for (let param of expectedFields) {
     is(data[param], extraParams[param],
        "Whitelisted experiment configs should be copied into Telemetry pings");
--- a/browser/experiments/test/addons/experiment-racybranch/bootstrap.js
+++ b/browser/experiments/test/addons/experiment-racybranch/bootstrap.js
@@ -8,17 +8,17 @@ var gStarted = false;
 
 function startup(data, reasonCode) {
   if (gStarted) {
     return;
   }
   gStarted = true;
 
   // delay realstartup to trigger the race condition
-  Cc['@mozilla.org/thread-manager;1'].getService(Ci.nsIThreadManager)
+  Cc["@mozilla.org/thread-manager;1"].getService(Ci.nsIThreadManager)
     .mainThread.dispatch(realstartup, 0);
 }
 
 function realstartup() {
   let experiments = Experiments.instance();
   let experiment = experiments._getActiveExperiment();
   if (experiment.branch) {
     Cu.reportError("Found pre-existing branch: " + experiment.branch);
--- a/browser/extensions/aushelper/bootstrap.js
+++ b/browser/extensions/aushelper/bootstrap.js
@@ -72,17 +72,17 @@ function startup() {
           for (let j = 4; j < 8; j++) {
             let c = regVal.charCodeAt(j).toString(16);
             if (c.length == 1) {
               c = "0" + c;
             }
             hexVal.unshift(c);
           }
           cpuRevMatch = false;
-          if (microCodeVersions.indexOf(parseInt(hexVal.join(''))) != -1) {
+          if (microCodeVersions.indexOf(parseInt(hexVal.join(""))) != -1) {
             cpuRevMatch = true;
           }
           break;
         }
       } catch (e) {
         if (i == keyNames.length - 1) {
           // The registry key name's value was not successfully queried.
           cpuRevMatch = null;
--- a/browser/extensions/pocket/content/main.js
+++ b/browser/extensions/pocket/content/main.js
@@ -81,17 +81,17 @@ var pktUI = (function() {
     }
 
     function pocketPanelDidHide(event) {
         if (_currentPanelDidHide) {
             _currentPanelDidHide(event);
         }
 
         // clear the panel
-        getPanelFrame().setAttribute('src', 'about:blank');
+        getPanelFrame().setAttribute("src", "about:blank");
     }
 
 
     // -- Communication to API -- //
 
     /**
      * Either save or attempt to log the user in
      */
@@ -114,60 +114,60 @@ var pktUI = (function() {
 
     // -- Panel UI -- //
 
     /**
      * Show the sign-up panel
      */
     function showSignUp() {
         // AB test: Direct logged-out users to tab vs panel
-        if (pktApi.getSignupPanelTabTestVariant() == 'v2') {
+        if (pktApi.getSignupPanelTabTestVariant() == "v2") {
             let site = Services.prefs.getCharPref("extensions.pocket.site");
-            openTabWithUrl('https://' + site + '/firefox_learnmore?s=ffi&t=autoredirect&tv=page_learnmore&src=ff_ext', true);
+            openTabWithUrl("https://" + site + "/firefox_learnmore?s=ffi&t=autoredirect&tv=page_learnmore&src=ff_ext", true);
 
             // force the panel closed before it opens
             getPanel().hidePopup();
 
             return;
         }
 
         // Control: Show panel as normal
         getFirefoxAccountSignedInUser(function(userdata) {
-            var fxasignedin = (typeof userdata == 'object' && userdata !== null) ? '1' : '0';
+            var fxasignedin = (typeof userdata == "object" && userdata !== null) ? "1" : "0";
             var startheight = 490;
             var inOverflowMenu = isInOverflowMenu();
-            var controlvariant = pktApi.getSignupPanelTabTestVariant() == 'control';
+            var controlvariant = pktApi.getSignupPanelTabTestVariant() == "control";
 
             if (inOverflowMenu) {
                 startheight = overflowMenuHeight;
             } else {
                 startheight = 460;
-                if (fxasignedin == '1') {
+                if (fxasignedin == "1") {
                     startheight = 406;
                 }
             }
             if (!controlvariant) {
                 startheight = 427;
             }
             var variant;
             if (inOverflowMenu) {
-                variant = 'overflow';
+                variant = "overflow";
             } else {
-                variant = 'storyboard_lm';
+                variant = "storyboard_lm";
             }
 
             showPanel("about:pocket-signup?pockethost="
                 + Services.prefs.getCharPref("extensions.pocket.site")
                 + "&fxasignedin="
                 + fxasignedin
                 + "&variant="
                 + variant
-                + '&controlvariant='
+                + "&controlvariant="
                 + controlvariant
-                + '&inoverflowmenu='
+                + "&inoverflowmenu="
                 + inOverflowMenu
                 + "&locale="
                 + getUILocale(), {
                     onShow() {
                     },
                     onHide: panelDidHide,
                     width: inOverflowMenu ? overflowMenuWidth : 300,
                     height: startheight
@@ -176,48 +176,48 @@ var pktUI = (function() {
     }
 
     /**
      * Show the logged-out state / sign-up panel
      */
     function saveAndShowConfirmation(url, title) {
 
         // Validate input parameter
-        if (typeof url !== 'undefined' && url.startsWith("about:reader?url=")) {
+        if (typeof url !== "undefined" && url.startsWith("about:reader?url=")) {
             url = ReaderMode.getOriginalUrl(url);
         }
 
-        var isValidURL = (typeof url !== 'undefined' && (url.startsWith("http") || url.startsWith('https')));
+        var isValidURL = (typeof url !== "undefined" && (url.startsWith("http") || url.startsWith("https")));
 
         var inOverflowMenu = isInOverflowMenu();
         var startheight = pktApi.isPremiumUser() && isValidURL ? savePanelHeights.expanded : savePanelHeights.collapsed;
         if (inOverflowMenu) {
             startheight = overflowMenuHeight;
         }
 
-        var panelId = showPanel("about:pocket-saved?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&premiumStatus=" + (pktApi.isPremiumUser() ? '1' : '0') + '&inoverflowmenu=' + inOverflowMenu + "&locale=" + getUILocale(), {
+        var panelId = showPanel("about:pocket-saved?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&premiumStatus=" + (pktApi.isPremiumUser() ? "1" : "0") + "&inoverflowmenu=" + inOverflowMenu + "&locale=" + getUILocale(), {
             onShow() {
-                var saveLinkMessageId = 'saveLink';
+                var saveLinkMessageId = "saveLink";
 
                 // Send error message for invalid url
                 if (!isValidURL) {
                     // TODO: Pass key for localized error in error object
                     let error = {
-                        message: 'Only links can be saved',
+                        message: "Only links can be saved",
                         localizedKey: "onlylinkssaved"
                     };
                     pktUIMessaging.sendErrorMessageToPanel(panelId, saveLinkMessageId, error);
                     return;
                 }
 
                 // Check online state
                 if (!navigator.onLine) {
                     // TODO: Pass key for localized error in error object
                     let error = {
-                        message: 'You must be connected to the Internet in order to save to Pocket. Please connect to the Internet and try again.'
+                        message: "You must be connected to the Internet in order to save to Pocket. Please connect to the Internet and try again."
                     };
                     pktUIMessaging.sendErrorMessageToPanel(panelId, saveLinkMessageId, error);
                     return;
                 }
 
                 // Add url
                 var options = {
                     success(data, request) {
@@ -272,17 +272,17 @@ var pktUI = (function() {
         // as if the user tries to click again on the toolbar button the overlay
         // will close instead of the button will be clicked
         var iframe = getPanelFrame();
 
         // Register event handlers
         registerEventMessages();
 
         // Load the iframe
-        iframe.setAttribute('src', url);
+        iframe.setAttribute("src", url);
 
         // Uncomment to leave panel open -- for debugging
         // panel.setAttribute('noautohide', true);
         // panel.setAttribute('consumeoutsideclicks', false);
         //
 
         // For some reason setting onpopupshown and onpopuphidden on the panel directly didn't work, so
         // do it this hacky way for now
@@ -330,17 +330,17 @@ var pktUI = (function() {
 
     /**
      * Register all of the messages needed for the panels
      */
     function registerEventMessages() {
         var iframe = getPanelFrame();
 
         // Only register the messages once
-        var didInitAttributeKey = 'did_init';
+        var didInitAttributeKey = "did_init";
         var didInitMessageListener = iframe.getAttribute(didInitAttributeKey);
         if (typeof didInitMessageListener !== "undefined" && didInitMessageListener == 1) {
             return;
         }
         iframe.setAttribute(didInitAttributeKey, 1);
 
         // When the panel is displayed it generated an event called
         // "show": we will listen for that event and when it happens,
@@ -532,21 +532,21 @@ var pktUI = (function() {
         var panel = frame;
         while (panel && panel.localName != "panel") {
             panel = panel.parentNode;
         }
         return panel;
     }
 
     function getPanelFrame() {
-        var frame = document.getElementById('pocket-panel-iframe');
+        var frame = document.getElementById("pocket-panel-iframe");
         if (!frame) {
             var frameParent = document.getElementById("PanelUI-pocketView").firstChild;
             frame = document.createElement("iframe");
-            frame.id = 'pocket-panel-iframe';
+            frame.id = "pocket-panel-iframe";
             frame.setAttribute("type", "content");
             frameParent.appendChild(frame);
         }
         return frame;
     }
 
     function getSubview() {
         var view = document.getElementById("PanelUI-pocketView");
@@ -594,17 +594,17 @@ var pktUI = (function() {
 // -- Communication to Background -- //
 // https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Interaction_between_privileged_and_non-privileged_pages
 var pktUIMessaging = (function() {
 
     /**
      * Prefix message id for message listening
      */
     function prefixedMessageId(messageId) {
-        return 'PKT_' + messageId;
+        return "PKT_" + messageId;
     }
 
     /**
      * Register a listener and callback for a specific messageId
      */
     function addMessageListener(iframe, messageId, callback) {
         iframe.addEventListener(prefixedMessageId(messageId), function(e) {
             var nodePrincipal = e.target.nodePrincipal;
@@ -634,17 +634,17 @@ var pktUIMessaging = (function() {
 
         var panelFrame = pktUI.getPanelFrame();
         if (!isPocketPanelFrameValid(panelFrame)) { return; }
 
         var doc = panelFrame.contentWindow.document;
         var documentElement = doc.documentElement;
 
         // Send message to panel
-        var panelMessageId = prefixedMessageId(panelId + '_' + messageId);
+        var panelMessageId = prefixedMessageId(panelId + "_" + messageId);
 
         var AnswerEvt = doc.createElement("PKTMessage");
         AnswerEvt.setAttribute("payload", JSON.stringify([payload]));
         documentElement.appendChild(AnswerEvt);
 
         var event = doc.createEvent("HTMLEvents");
         event.initEvent(panelMessageId, true, false);
         AnswerEvt.dispatchEvent(event);
--- a/browser/extensions/pocket/content/panels/js/messages.js
+++ b/browser/extensions/pocket/content/panels/js/messages.js
@@ -8,21 +8,21 @@ var pktPanelMessaging = (function() {
         if (panelId && panelId.length > 1) {
             return panelId[1];
         }
 
         return 0;
  }
 
  function prefixedMessageId(messageId) {
-   return 'PKT_' + messageId;
+   return "PKT_" + messageId;
  }
 
  function panelPrefixedMessageId(panelId, messageId) {
-   return prefixedMessageId(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]);
 
 			// TODO: Figure out why e.target.parentNode is null
--- a/browser/extensions/pocket/content/panels/js/saved.js
+++ b/browser/extensions/pocket/content/panels/js/saved.js
@@ -4,17 +4,17 @@ It does not contain any logic for saving
 */
 var PKT_SAVED_OVERLAY = function(options) {
     var myself = this;
     this.inited = false;
     this.active = false;
     this.wrapper = null;
     this.pockethost = "getpocket.com";
     this.savedItemId = 0;
-    this.savedUrl = '';
+    this.savedUrl = "";
     this.premiumStatus = false;
     this.preventCloseTimerCancel = false;
     this.closeValid = true;
     this.mouseInside = false;
     this.autocloseTimer = null;
     this.inoverflowmenu = false;
     this.dictJSON = {};
     this.autocloseTiming = 3500;
@@ -25,78 +25,78 @@ var PKT_SAVED_OVERLAY = function(options
     this.cxt_entered = 0;
     this.cxt_suggested = 0;
     this.cxt_removed = 0;
     this.justaddedsuggested = false;
     this.fillTagContainer = function(tags, container, tagclass) {
         container.children().remove();
         for (var i = 0; i < tags.length; i++) {
             var newtag = $('<li><a href="#" class="token_tag"></a></li>');
-            newtag.find('a').text(tags[i]);
+            newtag.find("a").text(tags[i]);
             newtag.addClass(tagclass);
             container.append(newtag);
             this.cxt_suggested_available++;
         }
     };
     this.fillUserTags = function() {
         thePKT_SAVED.sendMessage("getTags", {}, function(resp) {
-            if (typeof resp == 'object' && typeof resp.tags == 'object') {
+            if (typeof resp == "object" && typeof resp.tags == "object") {
                 myself.userTags = resp.tags;
             }
         });
     };
     this.fillSuggestedTags = function() {
-        if (!$('.pkt_ext_suggestedtag_detail').length) {
+        if (!$(".pkt_ext_suggestedtag_detail").length) {
             myself.suggestedTagsLoaded = true;
             myself.startCloseTimer();
             return;
         }
 
         thePKT_SAVED.sendMessage("getSuggestedTags",
         {
             url: myself.savedUrl
         }, function(resp) {
-            $('.pkt_ext_suggestedtag_detail').removeClass('pkt_ext_suggestedtag_detail_loading');
-            if (resp.status == 'success') {
+            $(".pkt_ext_suggestedtag_detail").removeClass("pkt_ext_suggestedtag_detail_loading");
+            if (resp.status == "success") {
                 var newtags = [];
                 for (var i = 0; i < resp.value.suggestedTags.length; i++) {
                     newtags.push(resp.value.suggestedTags[i].tag);
                 }
                 myself.suggestedTagsLoaded = true;
                 if (!myself.mouseInside) {
                     myself.startCloseTimer();
                 }
-                myself.fillTagContainer(newtags, $('.pkt_ext_suggestedtag_detail ul'), 'token_suggestedtag');
-            } else if (resp.status == 'error') {
+                myself.fillTagContainer(newtags, $(".pkt_ext_suggestedtag_detail ul"), "token_suggestedtag");
+            } else if (resp.status == "error") {
                 var msg = $('<p class="suggestedtag_msg">');
                 msg.text(resp.error.message);
-                $('.pkt_ext_suggestedtag_detail').append(msg);
+                $(".pkt_ext_suggestedtag_detail").append(msg);
                 this.suggestedTagsLoaded = true;
                 if (!myself.mouseInside) {
                     myself.startCloseTimer();
                 }
             }
         });
     }
     this.initAutoCloseEvents = function() {
-        this.wrapper.on('mouseenter', function() {
+        this.wrapper.on("mouseenter", function() {
             myself.mouseInside = true;
             myself.stopCloseTimer();
         });
-        this.wrapper.on('mouseleave', function() {
+        this.wrapper.on("mouseleave", function() {
             myself.mouseInside = false;
             myself.startCloseTimer();
         });
-        this.wrapper.on('click', function(e) {
+        this.wrapper.on("click", function(e) {
             myself.closeValid = false;
         });
     };
     this.startCloseTimer = function(manualtime) {
         var settime = manualtime ? manualtime : myself.autocloseTiming;
-        if (typeof myself.autocloseTimer == 'number') {
+        if (typeof myself.autocloseTimer == "number") {
             clearTimeout(myself.autocloseTimer);
         }
         myself.autocloseTimer = setTimeout(function() {
             if (myself.closeValid || myself.preventCloseTimerCancel) {
                 myself.preventCloseTimerCancel = false;
                 myself.closePopup();
             }
         }, settime);
@@ -107,113 +107,113 @@ var PKT_SAVED_OVERLAY = function(options
         }
         clearTimeout(myself.autocloseTimer);
     };
     this.closePopup = function() {
         myself.stopCloseTimer();
         thePKT_SAVED.sendMessage("close");
     };
     this.checkValidTagSubmit = function() {
-        var inputlength = $.trim($('.pkt_ext_tag_input_wrapper').find('.token-input-input-token').children('input').val()).length;
-        if ($('.pkt_ext_containersaved').find('.token-input-token').length || (inputlength > 0 && inputlength < 26)) {
-            $('.pkt_ext_containersaved').find('.pkt_ext_btn').removeClass('pkt_ext_btn_disabled');
+        var inputlength = $.trim($(".pkt_ext_tag_input_wrapper").find(".token-input-input-token").children("input").val()).length;
+        if ($(".pkt_ext_containersaved").find(".token-input-token").length || (inputlength > 0 && inputlength < 26)) {
+            $(".pkt_ext_containersaved").find(".pkt_ext_btn").removeClass("pkt_ext_btn_disabled");
         } else {
-            $('.pkt_ext_containersaved').find('.pkt_ext_btn').addClass('pkt_ext_btn_disabled');
+            $(".pkt_ext_containersaved").find(".pkt_ext_btn").addClass("pkt_ext_btn_disabled");
         }
         myself.updateSlidingTagList();
     };
     this.updateSlidingTagList = function() {
-        var inputleft = $('.token-input-input-token input').position().left;
-        var listleft = $('.token-input-list').position().left;
-        var listleftmanual = parseInt($('.token-input-list').css('left'));
+        var inputleft = $(".token-input-input-token input").position().left;
+        var listleft = $(".token-input-list").position().left;
+        var listleftmanual = parseInt($(".token-input-list").css("left"));
         var listleftnatural = listleft - listleftmanual;
-        var leftwidth = $('.pkt_ext_tag_input_wrapper').outerWidth();
+        var leftwidth = $(".pkt_ext_tag_input_wrapper").outerWidth();
 
         if ((inputleft + listleft + 20) > leftwidth) {
-            $('.token-input-list').css('left', Math.min(((inputleft + listleftnatural - leftwidth + 20) * -1), 0) + 'px');
+            $(".token-input-list").css("left", Math.min(((inputleft + listleftnatural - leftwidth + 20) * -1), 0) + "px");
         } else {
-            $('.token-input-list').css('left', '0');
+            $(".token-input-list").css("left", "0");
         }
     };
     this.checkPlaceholderStatus = function() {
-        if (this.wrapper.find('.pkt_ext_tag_input_wrapper').find('.token-input-token').length) {
-            this.wrapper.find('.token-input-input-token input').attr('placeholder', '');
+        if (this.wrapper.find(".pkt_ext_tag_input_wrapper").find(".token-input-token").length) {
+            this.wrapper.find(".token-input-input-token input").attr("placeholder", "");
         } else {
-            this.wrapper.find('.token-input-input-token input').attr('placeholder', $('.pkt_ext_tag_input').attr('placeholder')).css('width', '200px');
+            this.wrapper.find(".token-input-input-token input").attr("placeholder", $(".pkt_ext_tag_input").attr("placeholder")).css("width", "200px");
         }
     };
     this.initTagInput = function() {
-        var inputwrapper = $('.pkt_ext_tag_input_wrapper');
-        inputwrapper.find('.pkt_ext_tag_input').tokenInput([], {
+        var inputwrapper = $(".pkt_ext_tag_input_wrapper");
+        inputwrapper.find(".pkt_ext_tag_input").tokenInput([], {
             searchDelay: 200,
             minChars: 1,
             animateDropdown: false,
             noResultsHideDropdown: true,
             scrollKeyboard: true,
             emptyInputLength: 200,
             search_function(term, cb) {
                 var returnlist = [];
                 if (term.length) {
                     var limit = 15;
-                    var r = new RegExp('^' + term);
+                    var r = new RegExp("^" + term);
                     for (var i = 0; i < myself.userTags.length; i++) {
                         if (r.test(myself.userTags[i]) && limit > 0) {
                             returnlist.push({name:myself.userTags[i]});
                             limit--;
                         }
                     }
                 }
-                if (!$('.token-input-dropdown-tag').data('init')) {
-                    $('.token-input-dropdown-tag').css('width', inputwrapper.outerWidth()).data('init');
-                    inputwrapper.append($('.token-input-dropdown-tag'));
+                if (!$(".token-input-dropdown-tag").data("init")) {
+                    $(".token-input-dropdown-tag").css("width", inputwrapper.outerWidth()).data("init");
+                    inputwrapper.append($(".token-input-dropdown-tag"));
                 }
                 cb(returnlist);
             },
             textToData(text) {
                 if ($.trim(text).length > 25 || !$.trim(text).length) {
                     if (text.length > 25) {
                         myself.showTagsError(myself.dictJSON.maxtaglength);
                         changestamp = Date.now();
                         setTimeout(function() {
-                            $('.token-input-input-token input').val(text).focus();
+                            $(".token-input-input-token input").val(text).focus();
                         }, 10);
                     }
                     return null;
                 }
                 myself.hideTagsError();
                 return {name:myself.sanitizeText(text.toLowerCase())};
             },
             onReady() {
-                $('.token-input-dropdown').addClass('token-input-dropdown-tag');
-                inputwrapper.find('.token-input-input-token input').attr('placeholder', $('.tag-input').attr('placeholder')).css('width', '200px');
-                if ($('.pkt_ext_suggestedtag_detail').length) {
-                    myself.wrapper.find('.pkt_ext_suggestedtag_detail').on('click', '.token_tag', function(e) {
+                $(".token-input-dropdown").addClass("token-input-dropdown-tag");
+                inputwrapper.find(".token-input-input-token input").attr("placeholder", $(".tag-input").attr("placeholder")).css("width", "200px");
+                if ($(".pkt_ext_suggestedtag_detail").length) {
+                    myself.wrapper.find(".pkt_ext_suggestedtag_detail").on("click", ".token_tag", function(e) {
                         e.preventDefault();
                         var tag = $(e.target);
-                        if ($(this).parents('.pkt_ext_suggestedtag_detail_disabled').length) {
+                        if ($(this).parents(".pkt_ext_suggestedtag_detail_disabled").length) {
                             return;
                         }
                         myself.justaddedsuggested = true;
-                        inputwrapper.find('.pkt_ext_tag_input').tokenInput('add', {id:inputwrapper.find('.token-input-token').length, name:tag.text()});
-                        tag.addClass('token-suggestedtag-inactive');
-                        $('.token-input-input-token input').focus();
+                        inputwrapper.find(".pkt_ext_tag_input").tokenInput("add", {id:inputwrapper.find(".token-input-token").length, name:tag.text()});
+                        tag.addClass("token-suggestedtag-inactive");
+                        $(".token-input-input-token input").focus();
                     });
                 }
-                $('.token-input-list').on('keydown', 'input', function(e) {
+                $(".token-input-list").on("keydown", "input", function(e) {
                     if (e.which == 37) {
                         myself.updateSlidingTagList();
                     }
-                }).on('keypress', 'input', function(e) {
+                }).on("keypress", "input", function(e) {
                     if (e.which == 13) {
-                        if (typeof changestamp == 'undefined' || (Date.now() - changestamp > 250)) {
+                        if (typeof changestamp == "undefined" || (Date.now() - changestamp > 250)) {
                             e.preventDefault();
-                            myself.wrapper.find('.pkt_ext_btn').trigger('click');
+                            myself.wrapper.find(".pkt_ext_btn").trigger("click");
                         }
                     }
-                }).on('keyup', 'input', function(e) {
+                }).on("keyup", "input", function(e) {
                     myself.checkValidTagSubmit();
                 });
                 myself.checkPlaceholderStatus();
             },
             onAdd() {
                 myself.checkValidTagSubmit();
                 changestamp = Date.now();
                 myself.hideInactiveTags();
@@ -227,193 +227,193 @@ var PKT_SAVED_OVERLAY = function(options
             },
             onShowDropdown() {
                 thePKT_SAVED.sendMessage("expandSavePanel");
             },
             onHideDropdown() {
                 thePKT_SAVED.sendMessage("collapseSavePanel");
             }
         });
-        $('body').on('keydown', function(e) {
+        $("body").on("keydown", function(e) {
             var key = e.keyCode || e.which;
             if (key == 8) {
-                var selected = $('.token-input-selected-token');
+                var selected = $(".token-input-selected-token");
                 if (selected.length) {
                     e.preventDefault();
                     e.stopImmediatePropagation();
-                    inputwrapper.find('.pkt_ext_tag_input').tokenInput('remove', {name:selected.find('p').text()});
+                    inputwrapper.find(".pkt_ext_tag_input").tokenInput("remove", {name:selected.find("p").text()});
                 }
-            } else if ($(e.target).parent().hasClass('token-input-input-token')) {
+            } else if ($(e.target).parent().hasClass("token-input-input-token")) {
                 e.stopImmediatePropagation();
             }
         });
     };
     this.disableInput = function() {
-        this.wrapper.find('.pkt_ext_item_actions').addClass('pkt_ext_item_actions_disabled');
-        this.wrapper.find('.pkt_ext_btn').addClass('pkt_ext_btn_disabled');
-        this.wrapper.find('.pkt_ext_tag_input_wrapper').addClass('pkt_ext_tag_input_wrapper_disabled');
-        if (this.wrapper.find('.pkt_ext_suggestedtag_detail').length) {
-            this.wrapper.find('.pkt_ext_suggestedtag_detail').addClass('pkt_ext_suggestedtag_detail_disabled');
+        this.wrapper.find(".pkt_ext_item_actions").addClass("pkt_ext_item_actions_disabled");
+        this.wrapper.find(".pkt_ext_btn").addClass("pkt_ext_btn_disabled");
+        this.wrapper.find(".pkt_ext_tag_input_wrapper").addClass("pkt_ext_tag_input_wrapper_disabled");
+        if (this.wrapper.find(".pkt_ext_suggestedtag_detail").length) {
+            this.wrapper.find(".pkt_ext_suggestedtag_detail").addClass("pkt_ext_suggestedtag_detail_disabled");
         }
     };
     this.enableInput = function() {
-        this.wrapper.find('.pkt_ext_item_actions').removeClass('pkt_ext_item_actions_disabled');
+        this.wrapper.find(".pkt_ext_item_actions").removeClass("pkt_ext_item_actions_disabled");
         this.checkValidTagSubmit();
-        this.wrapper.find('.pkt_ext_tag_input_wrapper').removeClass('pkt_ext_tag_input_wrapper_disabled');
-        if (this.wrapper.find('.pkt_ext_suggestedtag_detail').length) {
-            this.wrapper.find('.pkt_ext_suggestedtag_detail').removeClass('pkt_ext_suggestedtag_detail_disabled');
+        this.wrapper.find(".pkt_ext_tag_input_wrapper").removeClass("pkt_ext_tag_input_wrapper_disabled");
+        if (this.wrapper.find(".pkt_ext_suggestedtag_detail").length) {
+            this.wrapper.find(".pkt_ext_suggestedtag_detail").removeClass("pkt_ext_suggestedtag_detail_disabled");
         }
     };
     this.initAddTagInput = function() {
-        $('.pkt_ext_btn').click(function(e) {
+        $(".pkt_ext_btn").click(function(e) {
             e.preventDefault();
-            if ($(this).hasClass('pkt_ext_btn_disabled') || $('.pkt_ext_edit_msg_active').filter('.pkt_ext_edit_msg_error').length) {
+            if ($(this).hasClass("pkt_ext_btn_disabled") || $(".pkt_ext_edit_msg_active").filter(".pkt_ext_edit_msg_error").length) {
                 return;
             }
             myself.disableInput();
-            $('.pkt_ext_containersaved').find('.pkt_ext_detail h2').text(myself.dictJSON.processingtags);
+            $(".pkt_ext_containersaved").find(".pkt_ext_detail h2").text(myself.dictJSON.processingtags);
             var originaltags = [];
-            $('.token-input-token').each(function() {
-                var text = $.trim($(this).find('p').text());
+            $(".token-input-token").each(function() {
+                var text = $.trim($(this).find("p").text());
                 if (text.length) {
                     originaltags.push(text);
                 }
             });
 
             thePKT_SAVED.sendMessage("addTags",
             {
                 url: myself.savedUrl,
                 tags: originaltags
             }, function(resp) {
-                if (resp.status == 'success') {
+                if (resp.status == "success") {
                     myself.showStateFinalMsg(myself.dictJSON.tagssaved);
-                } else if (resp.status == 'error') {
-                    $('.pkt_ext_edit_msg').addClass('pkt_ext_edit_msg_error pkt_ext_edit_msg_active').text(resp.error.message);
+                } else if (resp.status == "error") {
+                    $(".pkt_ext_edit_msg").addClass("pkt_ext_edit_msg_error pkt_ext_edit_msg_active").text(resp.error.message);
                 }
             });
         });
     };
     this.initRemovePageInput = function() {
-        $('.pkt_ext_removeitem').click(function(e) {
-            if ($(this).parents('.pkt_ext_item_actions_disabled').length) {
+        $(".pkt_ext_removeitem").click(function(e) {
+            if ($(this).parents(".pkt_ext_item_actions_disabled").length) {
                 e.preventDefault();
                 return;
             }
-            if ($(this).hasClass('pkt_ext_removeitem')) {
+            if ($(this).hasClass("pkt_ext_removeitem")) {
                 e.preventDefault();
                 myself.disableInput();
-                $('.pkt_ext_containersaved').find('.pkt_ext_detail h2').text(myself.dictJSON.processingremove);
+                $(".pkt_ext_containersaved").find(".pkt_ext_detail h2").text(myself.dictJSON.processingremove);
 
                 thePKT_SAVED.sendMessage("deleteItem",
                 {
                     itemId: myself.savedItemId
                 }, function(resp) {
-                    if (resp.status == 'success') {
+                    if (resp.status == "success") {
                         myself.showStateFinalMsg(myself.dictJSON.pageremoved);
-                    } else if (resp.status == 'error') {
-                        $('.pkt_ext_edit_msg').addClass('pkt_ext_edit_msg_error pkt_ext_edit_msg_active').text(resp.error.message);
+                    } else if (resp.status == "error") {
+                        $(".pkt_ext_edit_msg").addClass("pkt_ext_edit_msg_error pkt_ext_edit_msg_active").text(resp.error.message);
                     }
                 });
             }
         });
     };
     this.initOpenListInput = function() {
-        $('.pkt_ext_openpocket').click(function(e) {
+        $(".pkt_ext_openpocket").click(function(e) {
             e.preventDefault();
             thePKT_SAVED.sendMessage("openTabWithUrl",
             {
-                url: $(this).attr('href'),
+                url: $(this).attr("href"),
                 activate: true
             });
             myself.closePopup();
         });
     };
     this.showTagsError = function(msg) {
-        $('.pkt_ext_edit_msg').addClass('pkt_ext_edit_msg_error pkt_ext_edit_msg_active').text(msg);
-        $('.pkt_ext_tag_detail').addClass('pkt_ext_tag_error');
+        $(".pkt_ext_edit_msg").addClass("pkt_ext_edit_msg_error pkt_ext_edit_msg_active").text(msg);
+        $(".pkt_ext_tag_detail").addClass("pkt_ext_tag_error");
     };
     this.hideTagsError = function(msg) {
-        $('.pkt_ext_edit_msg').removeClass('pkt_ext_edit_msg_error pkt_ext_edit_msg_active').text('');
-        $('.pkt_ext_tag_detail').removeClass('pkt_ext_tag_error');
+        $(".pkt_ext_edit_msg").removeClass("pkt_ext_edit_msg_error pkt_ext_edit_msg_active").text("");
+        $(".pkt_ext_tag_detail").removeClass("pkt_ext_tag_error");
     };
     this.showActiveTags = function() {
-        if (!$('.pkt_ext_suggestedtag_detail').length) {
+        if (!$(".pkt_ext_suggestedtag_detail").length) {
             return;
         }
-        var activetokenstext = '|';
-        $('.token-input-token').each(function(index, element) {
-            activetokenstext += $(element).find('p').text() + '|';
+        var activetokenstext = "|";
+        $(".token-input-token").each(function(index, element) {
+            activetokenstext += $(element).find("p").text() + "|";
         });
 
-        var inactivetags = $('.pkt_ext_suggestedtag_detail').find('.token_tag_inactive');
+        var inactivetags = $(".pkt_ext_suggestedtag_detail").find(".token_tag_inactive");
         inactivetags.each(function(index, element) {
-            if (activetokenstext.indexOf('|' + $(element).text() + '|') == -1) {
-                $(element).removeClass('token_tag_inactive');
+            if (activetokenstext.indexOf("|" + $(element).text() + "|") == -1) {
+                $(element).removeClass("token_tag_inactive");
             }
         });
     };
     this.hideInactiveTags = function() {
-        if (!$('.pkt_ext_suggestedtag_detail').length) {
+        if (!$(".pkt_ext_suggestedtag_detail").length) {
             return;
         }
-        var activetokenstext = '|';
-        $('.token-input-token').each(function(index, element) {
-            activetokenstext += $(element).find('p').text() + '|';
+        var activetokenstext = "|";
+        $(".token-input-token").each(function(index, element) {
+            activetokenstext += $(element).find("p").text() + "|";
         });
-        var activesuggestedtags = $('.token_tag').not('.token_tag_inactive');
+        var activesuggestedtags = $(".token_tag").not(".token_tag_inactive");
         activesuggestedtags.each(function(index, element) {
-            if (activetokenstext.indexOf('|' + $(element).text() + '|') > -1) {
-                $(element).addClass('token_tag_inactive');
+            if (activetokenstext.indexOf("|" + $(element).text() + "|") > -1) {
+                $(element).addClass("token_tag_inactive");
             }
         });
     };
     this.showStateSaved = function(initobj) {
-        this.wrapper.find('.pkt_ext_detail h2').text(this.dictJSON.pagesaved);
-        this.wrapper.find('.pkt_ext_btn').addClass('pkt_ext_btn_disabled');
-        if (typeof initobj.item == 'object') {
+        this.wrapper.find(".pkt_ext_detail h2").text(this.dictJSON.pagesaved);
+        this.wrapper.find(".pkt_ext_btn").addClass("pkt_ext_btn_disabled");
+        if (typeof initobj.item == "object") {
             this.savedItemId = initobj.item.item_id;
             this.savedUrl = initobj.item.given_url;
         }
-        $('.pkt_ext_containersaved').addClass('pkt_ext_container_detailactive').removeClass('pkt_ext_container_finalstate');
+        $(".pkt_ext_containersaved").addClass("pkt_ext_container_detailactive").removeClass("pkt_ext_container_finalstate");
 
         myself.fillUserTags();
         if (myself.suggestedTagsLoaded) {
             myself.startCloseTimer();
         } else {
             myself.fillSuggestedTags();
         }
     };
     this.sanitizeText = function(s) {
         var sanitizeMap = {
             "&": "&amp;",
             "<": "&lt;",
             ">": "&gt;",
-            '"': '&quot;',
-            "'": '&#39;'
+            '"': "&quot;",
+            "'": "&#39;"
         };
-        if (typeof s !== 'string') {
-            return '';
+        if (typeof s !== "string") {
+            return "";
         }
         return String(s).replace(/[&<>"']/g, function(str) {
             return sanitizeMap[str];
         });
     };
     this.showStateFinalMsg = function(msg) {
-        this.wrapper.find('.pkt_ext_tag_detail').one('webkitTransitionEnd transitionend msTransitionEnd oTransitionEnd', function(e) {
-            $(this).off('webkitTransitionEnd transitionend msTransitionEnd oTransitionEnd');
+        this.wrapper.find(".pkt_ext_tag_detail").one("webkitTransitionEnd transitionend msTransitionEnd oTransitionEnd", function(e) {
+            $(this).off("webkitTransitionEnd transitionend msTransitionEnd oTransitionEnd");
             myself.preventCloseTimerCancel = true;
             myself.startCloseTimer(myself.autocloseTimingFinalState);
-            myself.wrapper.find('.pkt_ext_detail h2').text(msg);
+            myself.wrapper.find(".pkt_ext_detail h2").text(msg);
         });
-        this.wrapper.addClass('pkt_ext_container_finalstate');
+        this.wrapper.addClass("pkt_ext_container_finalstate");
     };
     this.showStateError = function(headline, detail) {
-        this.wrapper.find('.pkt_ext_detail h2').text(headline);
-        this.wrapper.find('.pkt_ext_detail h3').text(detail);
-        this.wrapper.addClass('pkt_ext_container_detailactive pkt_ext_container_finalstate pkt_ext_container_finalerrorstate');
+        this.wrapper.find(".pkt_ext_detail h2").text(headline);
+        this.wrapper.find(".pkt_ext_detail h3").text(detail);
+        this.wrapper.addClass("pkt_ext_container_detailactive pkt_ext_container_finalstate pkt_ext_container_finalerrorstate");
         this.preventCloseTimerCancel = true;
         this.startCloseTimer(myself.autocloseTimingFinalState);
     }
     this.getTranslations = function() {
         this.dictJSON = window.pocketStrings;
     };
 };
 
@@ -427,42 +427,42 @@ PKT_SAVED_OVERLAY.prototype = {
         // set translations
         this.getTranslations();
 
         // set host
         this.dictJSON.pockethost = this.pockethost;
 
         // extra modifier class for collapsed state
         if (this.inoverflowmenu) {
-            $('body').addClass('pkt_ext_saved_overflow');
+            $("body").addClass("pkt_ext_saved_overflow");
         }
 
         // extra modifier class for language
         if (this.locale) {
-            $('body').addClass('pkt_ext_saved_' + this.locale);
+            $("body").addClass("pkt_ext_saved_" + this.locale);
         }
 
         // Create actual content
-        $('body').append(Handlebars.templates.saved_shell(this.dictJSON));
+        $("body").append(Handlebars.templates.saved_shell(this.dictJSON));
 
         // Add in premium content (if applicable based on premium status)
         this.createPremiumFunctionality();
 
         // Initialize functionality for overlay
-        this.wrapper = $('.pkt_ext_containersaved');
+        this.wrapper = $(".pkt_ext_containersaved");
         this.initTagInput();
         this.initAddTagInput();
         this.initRemovePageInput();
         this.initOpenListInput();
         this.initAutoCloseEvents();
     },
     createPremiumFunctionality() {
-        if (this.premiumStatus && !$('.pkt_ext_suggestedtag_detail').length) {
-            $('body').append(Handlebars.templates.saved_premiumshell(this.dictJSON));
-            $('.pkt_ext_initload').append(Handlebars.templates.saved_premiumextras(this.dictJSON));
+        if (this.premiumStatus && !$(".pkt_ext_suggestedtag_detail").length) {
+            $("body").append(Handlebars.templates.saved_premiumshell(this.dictJSON));
+            $(".pkt_ext_initload").append(Handlebars.templates.saved_premiumextras(this.dictJSON));
         }
     }
 };
 
 
 // Layer between Bookmarklet and Extensions
 var PKT_SAVED = function() {};
 
@@ -484,40 +484,40 @@ PKT_SAVED.prototype = {
     sendMessage(messageId, payload, callback) {
         pktPanelMessaging.sendMessage(this.panelId, messageId, payload, callback);
     },
 
     create() {
         var myself = this;
         var url = window.location.href.match(/premiumStatus=([\w|\d|\.]*)&?/);
         if (url && url.length > 1) {
-            myself.overlay.premiumStatus = (url[1] == '1');
+            myself.overlay.premiumStatus = (url[1] == "1");
         }
         var host = window.location.href.match(/pockethost=([\w|\.]*)&?/);
         if (host && host.length > 1) {
             myself.overlay.pockethost = host[1];
         }
         var inoverflowmenu = window.location.href.match(/inoverflowmenu=([\w|\.]*)&?/);
         if (inoverflowmenu && inoverflowmenu.length > 1) {
-            myself.overlay.inoverflowmenu = (inoverflowmenu[1] == 'true');
+            myself.overlay.inoverflowmenu = (inoverflowmenu[1] == "true");
         }
         var locale = window.location.href.match(/locale=([\w|\.]*)&?/);
         if (locale && locale.length > 1) {
             myself.overlay.locale = locale[1].toLowerCase();
         }
 
         myself.overlay.create();
 
         // tell back end we're ready
         thePKT_SAVED.sendMessage("show");
 
         // wait confirmation of save before flipping to final saved state
         thePKT_SAVED.addMessageListener("saveLink", function(resp) {
-            if (resp.status == 'error') {
-                if (typeof resp.error == 'object') {
+            if (resp.status == "error") {
+                if (typeof resp.error == "object") {
                     if (resp.error.localizedKey) {
                         myself.overlay.showStateError(myself.overlay.dictJSON.pagenotsaved, myself.overlay.dictJSON[resp.error.localizedKey]);
                     } else {
                         myself.overlay.showStateError(myself.overlay.dictJSON.pagenotsaved, resp.error.message);
                     }
                 } else {
                     myself.overlay.showStateError(myself.overlay.dictJSON.pagenotsaved, myself.overlay.dictJSON.errorgeneric);
                 }
@@ -536,16 +536,16 @@ PKT_SAVED.prototype = {
         window.thePKT_SAVED = thePKT_SAVED;
         thePKT_SAVED.init();
     }
 
     var pocketHost = thePKT_SAVED.overlay.pockethost;
     // send an async message to get string data
     thePKT_SAVED.sendMessage("initL10N", {
             tos: [
-                'https://' + pocketHost + '/tos?s=ffi&t=tos&tv=panel_tryit',
-                'https://' + pocketHost + '/privacy?s=ffi&t=privacypolicy&tv=panel_tryit'
+                "https://" + pocketHost + "/tos?s=ffi&t=tos&tv=panel_tryit",
+                "https://" + pocketHost + "/privacy?s=ffi&t=privacypolicy&tv=panel_tryit"
             ]
         }, function(resp) {
         window.pocketStrings = resp.strings;
         window.thePKT_SAVED.create();
     });
 });
--- a/browser/extensions/pocket/content/panels/js/signup.js
+++ b/browser/extensions/pocket/content/panels/js/signup.js
@@ -4,52 +4,52 @@ It does not contain any logic for saving
 */
 var PKT_SIGNUP_OVERLAY = function(options) {
     var myself = this;
     this.inited = false;
     this.active = false;
     this.delayedStateSaved = false;
     this.wrapper = null;
     this.variant = window.___PKT__SIGNUP_VARIANT;
-    this.tagline = window.___PKT__SIGNUP_TAGLINE || '';
+    this.tagline = window.___PKT__SIGNUP_TAGLINE || "";
     this.preventCloseTimerCancel = false;
     this.translations = {};
     this.closeValid = true;
     this.mouseInside = false;
     this.autocloseTimer = null;
     this.variant = "";
     this.inoverflowmenu = false;
     this.controlvariant;
     this.pockethost = "getpocket.com";
     this.fxasignedin = false;
     this.dictJSON = {};
     this.initCloseTabEvents = function() {
-        $('.btn,.pkt_ext_learnmore,.alreadyhave > a').click(function(e) {
+        $(".btn,.pkt_ext_learnmore,.alreadyhave > a").click(function(e) {
             e.preventDefault();
             thePKT_SIGNUP.sendMessage("openTabWithUrl",
             {
-                url: $(this).attr('href'),
+                url: $(this).attr("href"),
                 activate: true
             });
             myself.closePopup();
         });
     };
     this.closePopup = function() {
         thePKT_SIGNUP.sendMessage("close");
     };
     this.sanitizeText = function(s) {
         var sanitizeMap = {
             "&": "&amp;",
             "<": "&lt;",
             ">": "&gt;",
-            '"': '&quot;',
-            "'": '&#39;'
+            '"': "&quot;",
+            "'": "&#39;"
         };
-        if (typeof s !== 'string') {
-            return '';
+        if (typeof s !== "string") {
+            return "";
         }
         return String(s).replace(/[&<>"']/g, function(str) {
             return sanitizeMap[str];
         });
     };
     this.getTranslations = function() {
         this.dictJSON = window.pocketStrings;
     };
@@ -63,60 +63,60 @@ PKT_SIGNUP_OVERLAY.prototype = {
             this.controlvariant = controlvariant[1];
         }
         var variant = window.location.href.match(/variant=([\w|\.]*)&?/);
         if (variant && variant.length > 1) {
             this.variant = variant[1];
         }
         var fxasignedin = window.location.href.match(/fxasignedin=([\w|\d|\.]*)&?/);
         if (fxasignedin && fxasignedin.length > 1) {
-            this.fxasignedin = (fxasignedin[1] == '1');
+            this.fxasignedin = (fxasignedin[1] == "1");
         }
         var host = window.location.href.match(/pockethost=([\w|\.]*)&?/);
         if (host && host.length > 1) {
             this.pockethost = host[1];
         }
         var inoverflowmenu = window.location.href.match(/inoverflowmenu=([\w|\.]*)&?/);
         if (inoverflowmenu && inoverflowmenu.length > 1) {
-            this.inoverflowmenu = (inoverflowmenu[1] == 'true');
+            this.inoverflowmenu = (inoverflowmenu[1] == "true");
         }
         var locale = window.location.href.match(/locale=([\w|\.]*)&?/);
         if (locale && locale.length > 1) {
            this.locale = locale[1].toLowerCase();
         }
 
         if (this.active) {
             return;
         }
         this.active = true;
 
         // set translations
         this.getTranslations();
         this.dictJSON.fxasignedin = this.fxasignedin ? 1 : 0;
-        this.dictJSON.controlvariant = this.controlvariant == 'true' ? 1 : 0;
-        this.dictJSON.variant = (this.variant ? this.variant : 'undefined');
-        this.dictJSON.variant += this.fxasignedin ? '_fxa' : '_nonfxa';
+        this.dictJSON.controlvariant = this.controlvariant == "true" ? 1 : 0;
+        this.dictJSON.variant = (this.variant ? this.variant : "undefined");
+        this.dictJSON.variant += this.fxasignedin ? "_fxa" : "_nonfxa";
         this.dictJSON.pockethost = this.pockethost;
         this.dictJSON.showlearnmore = true;
 
         // extra modifier class for collapsed state
         if (this.inoverflowmenu) {
-            $('body').addClass('pkt_ext_signup_overflow');
+            $("body").addClass("pkt_ext_signup_overflow");
         }
 
         // extra modifier class for language
         if (this.locale) {
-            $('body').addClass('pkt_ext_signup_' + this.locale);
+            $("body").addClass("pkt_ext_signup_" + this.locale);
         }
 
         // Create actual content
-        if (this.variant == 'overflow') {
-            $('body').append(Handlebars.templates.signup_shell(this.dictJSON));
+        if (this.variant == "overflow") {
+            $("body").append(Handlebars.templates.signup_shell(this.dictJSON));
         } else {
-            $('body').append(Handlebars.templates.signupstoryboard_shell(this.dictJSON));
+            $("body").append(Handlebars.templates.signupstoryboard_shell(this.dictJSON));
         }
 
 
         // tell background we're ready
         thePKT_SIGNUP.sendMessage("show");
 
         // close events
         this.initCloseTabEvents();
@@ -160,16 +160,16 @@ PKT_SIGNUP.prototype = {
         window.thePKT_SIGNUP = thePKT_SIGNUP;
         thePKT_SIGNUP.init();
     }
 
     var pocketHost = thePKT_SIGNUP.overlay.pockethost;
     // send an async message to get string data
     thePKT_SIGNUP.sendMessage("initL10N", {
             tos: [
-                'https://' + pocketHost + '/tos?s=ffi&t=tos&tv=panel_tryit',
-                'https://' + pocketHost + '/privacy?s=ffi&t=privacypolicy&tv=panel_tryit'
+                "https://" + pocketHost + "/tos?s=ffi&t=tos&tv=panel_tryit",
+                "https://" + pocketHost + "/privacy?s=ffi&t=privacypolicy&tv=panel_tryit"
             ]
         }, function(resp) {
         window.pocketStrings = resp.strings;
         window.thePKT_SIGNUP.create();
     });
 });
--- a/browser/extensions/pocket/content/pktApi.jsm
+++ b/browser/extensions/pocket/content/pktApi.jsm
@@ -171,42 +171,42 @@ var pktApi = (function() {
     /**
      * Returns access token or undefined if no logged in user was found
      * @return {string | undefined} Access token for logged in user user
      */
     function getAccessToken() {
         var pocketCookies = getCookiesFromPocket();
 
         // If no cookie was found just return undefined
-        if (typeof pocketCookies['ftv1'] === "undefined") {
+        if (typeof pocketCookies["ftv1"] === "undefined") {
             return undefined;
         }
 
         // Check if a new user logged in in the meantime and clearUserData if so
-        var sessionId = pocketCookies['fsv1'];
-        var lastSessionId = getSetting('fsv1');
+        var sessionId = pocketCookies["fsv1"];
+        var lastSessionId = getSetting("fsv1");
         if (sessionId !== lastSessionId) {
             clearUserData();
             setSetting("fsv1", sessionId);
         }
 
         // Return access token
-        return pocketCookies['ftv1'];
+        return pocketCookies["ftv1"];
     }
 
     /**
      * Get the current premium status of the user
      * @return {number | undefined} Premium status of user
      */
     function getPremiumStatus() {
         var premiumStatus = getSetting("premium_status");
         if (typeof premiumStatus === "undefined") {
             // Premium status is not in settings try get it from cookie
             var pocketCookies = getCookiesFromPocket();
-            premiumStatus = pocketCookies['ps'];
+            premiumStatus = pocketCookies["ps"];
         }
         return premiumStatus;
     }
 
     /**
      * Helper method to check if a user is premium or not
      * @return {Boolean} Boolean if user is premium or not
      */
@@ -287,18 +287,18 @@ var pktApi = (function() {
                     }
                     var error = {message: errorMessage};
                     options.error(error, request);
                 }
             }
         };
 
         // Set headers
-        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
-        request.setRequestHeader('X-Accept', ' application/json');
+        request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+        request.setRequestHeader("X-Accept", " application/json");
 
         // Serialize and Fire off the request
         var str = [];
         for (var p in data) {
             if (data.hasOwnProperty(p)) {
                 str.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p]));
             }
         }
@@ -325,17 +325,17 @@ var pktApi = (function() {
      * Add a new link to Pocket
      * @param {string} url     URL of the link
      * @param {Object | undefined} options Can provide a string-based title, a
      *                                     `success` callback and an `error` callback.
      * @return {Boolean} Returns Boolean whether the api call started sucessfully
      */
     function addLink(url, options) {
 
-        var since = getSetting('latestSince');
+        var since = getSetting("latestSince");
         var accessToken = getAccessToken();
 
         var sendData = {
             access_token: accessToken,
             url,
             since: since ? since : 0
         };
 
@@ -347,28 +347,28 @@ var pktApi = (function() {
             path: "/firefox/save",
             data: sendData,
             success(data) {
 
                 // Update premium status, tags and since
                 var tags = data.tags;
                 if ((typeof tags !== "undefined") && Array.isArray(tags)) {
                     // If a tagslist is in the response replace the tags
-                    setSetting('tags', JSON.stringify(data.tags));
+                    setSetting("tags", JSON.stringify(data.tags));
                 }
 
                 // Update premium status
                 var premiumStatus = data.premium_status;
                 if (typeof premiumStatus !== "undefined") {
                     // If a premium_status is in the response replace the premium_status
                     setSetting("premium_status", premiumStatus);
                 }
 
                 // Save since value for further requests
-                setSetting('latestSince', data.since);
+                setSetting("latestSince", data.since);
 
                 if (options.success) {
                     options.success.apply(options, Array.apply(null, arguments));
                 }
             },
             error: options.error
         });
     }
@@ -397,17 +397,17 @@ var pktApi = (function() {
      *                                       with further data to send to the
      *                                       API. Can have success and error
      *                                       callbacks
      * @return {Boolean} Returns Boolean whether the api call started sucessfully
      */
     function sendAction(action, options) {
         // Options can have an 'actionInfo' object. This actionInfo object gets
         // passed through to the action object that will be send to the API endpoint
-        if (typeof options.actionInfo !== 'undefined') {
+        if (typeof options.actionInfo !== "undefined") {
             action = extend(action, options.actionInfo);
         }
         return sendActions([action], options);
     }
 
     /**
      * General function to send all kinds of actions like adding of links or
      * removing of items via the API
@@ -603,22 +603,22 @@ var pktApi = (function() {
             error: options.error
         });
     }
 
     /**
      * Helper function to get current signup AB group the user is in
      */
     function getSignupPanelTabTestVariant() {
-        return getMultipleTestOption('panelSignUp', {control: 1, v1: 8, v2: 1 })
+        return getMultipleTestOption("panelSignUp", {control: 1, v1: 8, v2: 1 })
     }
 
     function getMultipleTestOption(testName, testOptions) {
         // Get the test from preferences if we've already assigned the user to a test
-        var settingName = 'test.' + testName;
+        var settingName = "test." + testName;
         var assignedValue = getSetting(settingName);
         var valArray = [];
 
         // If not assigned yet, pick and store a value
         if (!assignedValue) {
             // Get a weighted array of test variants from the testOptions object
             Object.keys(testOptions).forEach(function(key) {
               for (var i = 0; i < testOptions[key]; i++) {
--- a/browser/extensions/presentation/content/PresentationDevicePrompt.jsm
+++ b/browser/extensions/presentation/content/PresentationDevicePrompt.jsm
@@ -162,17 +162,17 @@ PresentationPermissionPrompt.prototype =
         this.request.cancel(Cr.NS_ERROR_NOT_AVAILABLE);
       },
       dismiss: true,
     }];
   },
   // PRIVATE APIs
   get _domainName() {
     if (this.principal.URI instanceof Ci.nsIFileURL) {
-      return this.principal.URI.path.split('/')[1];
+      return this.principal.URI.path.split("/")[1];
     }
     return this.principal.URI.hostPort;
   },
   _createPopupContent() {
     log("_createPopupContent");
 
     if (!this._devices.length) {
       log("No available devices can be listed!");
--- a/browser/modules/AttributionCode.jsm
+++ b/browser/modules/AttributionCode.jsm
@@ -3,24 +3,24 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 this.EXPORTED_SYMBOLS = ["AttributionCode"];
 
 const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, 'AppConstants',
-  'resource://gre/modules/AppConstants.jsm');
-XPCOMUtils.defineLazyModuleGetter(this, 'OS',
-  'resource://gre/modules/osfile.jsm');
-XPCOMUtils.defineLazyModuleGetter(this, 'Services',
-  'resource://gre/modules/Services.jsm');
-XPCOMUtils.defineLazyModuleGetter(this, 'Task',
-  'resource://gre/modules/Task.jsm');
+XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
+  "resource://gre/modules/AppConstants.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "OS",
+  "resource://gre/modules/osfile.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "Services",
+  "resource://gre/modules/Services.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "Task",
+  "resource://gre/modules/Task.jsm");
 
 const ATTR_CODE_MAX_LENGTH = 200;
 const ATTR_CODE_KEYS_REGEX = /^source|medium|campaign|content$/;
 const ATTR_CODE_VALUE_REGEX = /[a-zA-Z0-9_%\\-\\.\\(\\)]*/;
 const ATTR_CODE_FIELD_SEPARATOR = "%26"; // URL-encoded &
 const ATTR_CODE_KEY_VALUE_SEPARATOR = "%3D"; // URL-encoded =
 
 let gCachedAttrData = null;
--- a/browser/modules/BrowserUsageTelemetry.jsm
+++ b/browser/modules/BrowserUsageTelemetry.jsm
@@ -367,17 +367,17 @@ let BrowserUsageTelemetry = {
 
     if (isOneOff) {
       if (!KNOWN_ONEOFF_SOURCES.includes(source)) {
         // Silently drop the error if this bogus call
         // came from 'urlbar' or 'searchbar'. They're
         // calling |recordSearch| twice from two different
         // code paths because they want to record the search
         // in SEARCH_COUNTS.
-        if (['urlbar', 'searchbar'].includes(source)) {
+        if (["urlbar", "searchbar"].includes(source)) {
           Services.telemetry.getKeyedHistogramById("SEARCH_COUNTS").add(countId);
           return;
         }
         throw new Error("Unknown source for one-off search: " + source);
       }
     } else {
       if (!KNOWN_SEARCH_SOURCES.includes(source)) {
         throw new Error("Unknown source for search: " + source);
--- a/browser/modules/DirectoryLinksProvider.jsm
+++ b/browser/modules/DirectoryLinksProvider.jsm
@@ -35,17 +35,17 @@ XPCOMUtils.defineLazyGetter(this, "gText
   return new TextDecoder();
 });
 XPCOMUtils.defineLazyGetter(this, "gCryptoHash", function() {
   return Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
 });
 XPCOMUtils.defineLazyGetter(this, "gUnicodeConverter", function() {
   let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
                     .createInstance(Ci.nsIScriptableUnicodeConverter);
-  converter.charset = 'utf8';
+  converter.charset = "utf8";
   return converter;
 });
 
 
 // The filename where directory links are stored locally
 const DIRECTORY_LINKS_FILE = "directoryLinks.json";
 const DIRECTORY_LINKS_TYPE = "application/json";
 
@@ -594,21 +594,21 @@ var DirectoryLinksProvider = {
       base = Services.eTLD.getBaseDomain(uri);
     } catch (ex) {}
     // Require a scheme match and the base only if desired
     return allowed.has(scheme) && (!checkBase || ALLOWED_URL_BASE.has(base));
   },
 
   _escapeChars(text) {
     let charMap = {
-      '&': '&amp;',
-      '<': '&lt;',
-      '>': '&gt;',
-      '"': '&quot;',
-      "'": '&#039;'
+      "&": "&amp;",
+      "<": "&lt;",
+      ">": "&gt;",
+      '"': "&quot;",
+      "'": "&#039;"
     };
 
     return text.replace(/[&<>"']/g, (character) => charMap[character]);
   },
 
   /**
    * Gets the current set of directory links.
    * @param aCallback The function that the array of links is passed to.
--- a/browser/modules/FormSubmitObserver.jsm
+++ b/browser/modules/FormSubmitObserver.jsm
@@ -196,23 +196,23 @@ FormSubmitObserver.prototype =
     // Note, this is relative to the browser and needs to be translated
     // in chrome.
     panelData.contentRect = BrowserUtils.getElementBoundingRect(aElement);
 
     // We want to show the popup at the middle of checkbox and radio buttons
     // and where the content begin for the other elements.
     let offset = 0;
 
-    if (aElement.tagName == 'INPUT' &&
-        (aElement.type == 'radio' || aElement.type == 'checkbox')) {
+    if (aElement.tagName == "INPUT" &&
+        (aElement.type == "radio" || aElement.type == "checkbox")) {
       panelData.position = "bottomcenter topleft";
     } else {
       let win = aElement.ownerGlobal;
       let style = win.getComputedStyle(aElement, null);
-      if (style.direction == 'rtl') {
+      if (style.direction == "rtl") {
         offset = parseInt(style.paddingRight) + parseInt(style.borderRightWidth);
       } else {
         offset = parseInt(style.paddingLeft) + parseInt(style.borderLeftWidth);
       }
       let zoomFactor = this._getWindowUtils().fullZoom;
       panelData.offset = Math.round(offset * zoomFactor);
       panelData.position = "after_start";
     }
--- a/browser/modules/PermissionUI.jsm
+++ b/browser/modules/PermissionUI.jsm
@@ -67,22 +67,22 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://gre/modules/Services.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "SitePermissions",
   "resource:///modules/SitePermissions.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "gBrandBundle", function() {
   return Services.strings
-                 .createBundle('chrome://branding/locale/brand.properties');
+                 .createBundle("chrome://branding/locale/brand.properties");
 });
 
 XPCOMUtils.defineLazyGetter(this, "gBrowserBundle", function() {
   return Services.strings
-                 .createBundle('chrome://browser/locale/browser.properties');
+                 .createBundle("chrome://browser/locale/browser.properties");
 });
 
 this.PermissionUI = {};
 
 /**
  * PermissionPromptPrototype should be subclassed by callers that
  * want to display prompts to the user. See each method and property
  * below for guidance on what to override.
@@ -333,17 +333,17 @@ this.PermissionPromptPrototype = {
     }
 
     let mainAction = popupNotificationActions.length ?
                      popupNotificationActions[0] : null;
     let secondaryActions = popupNotificationActions.splice(1);
 
     let options = this.popupOptions;
 
-    if (!options.hasOwnProperty('displayURI') || options.displayURI) {
+    if (!options.hasOwnProperty("displayURI") || options.displayURI) {
       options.displayURI = this.principal.URI;
     }
     // Permission prompts are always persistent and don't have a close button.
     options.persistent = true;
     options.hideClose = true;
 
     this.onBeforeShow();
     chromeWin.PopupNotifications.show(this.browser,
--- a/browser/modules/PluginContent.jsm
+++ b/browser/modules/PluginContent.jsm
@@ -534,21 +534,21 @@ PluginContent.prototype = {
       case "PluginDisabled":
         let manageLink = this.getPluginUI(plugin, "managePluginsLink");
         this.addLinkClickCallback(manageLink, "forwardCallback", "managePlugins");
         shouldShowNotification = true;
         break;
 
       case "PluginInstantiated":
         let key = this._getPluginInfo(plugin).pluginTag.niceName;
-        Services.telemetry.getKeyedHistogramById('PLUGIN_ACTIVATION_COUNT').add(key);
+        Services.telemetry.getKeyedHistogramById("PLUGIN_ACTIVATION_COUNT").add(key);
         shouldShowNotification = true;
         let pluginRect = plugin.getBoundingClientRect();
         if (pluginRect.width <= 5 && pluginRect.height <= 5) {
-          Services.telemetry.getHistogramById('PLUGIN_TINY_CONTENT').add(1);
+          Services.telemetry.getHistogramById("PLUGIN_TINY_CONTENT").add(1);
         }
         break;
     }
 
     if (this._getPluginInfo(plugin).mimetype === FLASH_MIME_TYPE) {
       this._recordFlashPluginTelemetry(eventType, plugin);
     }
 
@@ -597,35 +597,35 @@ PluginContent.prototype = {
 
     if (!this.flashPluginStats.plugins.has(plugin)) {
       // Reporting plugin instance and its dimensions only once.
       this.flashPluginStats.plugins.add(plugin);
 
       this.flashPluginStats.instancesCount++;
 
       let pluginRect = plugin.getBoundingClientRect();
-      Services.telemetry.getHistogramById('FLASH_PLUGIN_WIDTH')
+      Services.telemetry.getHistogramById("FLASH_PLUGIN_WIDTH")
                        .add(pluginRect.width);
-      Services.telemetry.getHistogramById('FLASH_PLUGIN_HEIGHT')
+      Services.telemetry.getHistogramById("FLASH_PLUGIN_HEIGHT")
                        .add(pluginRect.height);
-      Services.telemetry.getHistogramById('FLASH_PLUGIN_AREA')
+      Services.telemetry.getHistogramById("FLASH_PLUGIN_AREA")
                        .add(pluginRect.width * pluginRect.height);
 
       let state = this._getPluginInfo(plugin).fallbackType;
       if (state === null) {
         state = Ci.nsIObjectLoadingContent.PLUGIN_UNSUPPORTED;
       }
-      Services.telemetry.getHistogramById('FLASH_PLUGIN_STATES')
+      Services.telemetry.getHistogramById("FLASH_PLUGIN_STATES")
                        .add(state);
     }
   },
 
   _finishRecordingFlashPluginTelemetry() {
     if (this.flashPluginStats) {
-      Services.telemetry.getHistogramById('FLASH_PLUGIN_INSTANCES_ON_PAGE')
+      Services.telemetry.getHistogramById("FLASH_PLUGIN_INSTANCES_ON_PAGE")
                         .add(this.flashPluginStats.instancesCount);
     delete this.flashPluginStats;
     }
   },
 
   isKnownPlugin(objLoadingContent) {
     return (objLoadingContent.getContentTypeForMIMEType(objLoadingContent.actualType) ==
             Ci.nsIObjectLoadingContent.TYPE_PLUGIN);
@@ -732,18 +732,18 @@ PluginContent.prototype = {
 
   onOverlayClick(event) {
     let document = event.target.ownerDocument;
     let plugin = document.getBindingParent(event.target);
     let contentWindow = plugin.ownerGlobal.top;
     let overlay = this.getPluginUI(plugin, "main");
     // Have to check that the target is not the link to update the plugin
     if (!(event.originalTarget instanceof contentWindow.HTMLAnchorElement) &&
-        (event.originalTarget.getAttribute('anonid') != 'closeIcon') &&
-        !overlay.hasAttribute('dismissed') &&
+        (event.originalTarget.getAttribute("anonid") != "closeIcon") &&
+        !overlay.hasAttribute("dismissed") &&
         event.button == 0 &&
         event.isTrusted) {
       this._showClickToPlayNotification(plugin, true);
     event.stopPropagation();
     event.preventDefault();
     }
   },
 
@@ -987,17 +987,17 @@ PluginContent.prototype = {
     /**
      * Traverses down iframes until it find a non-iframe full screen DOM element.
      * @param fullScreenIframe
      *  Target iframe to begin searching from.
      * @returns DOM element
      *  The full screen DOM element contained within the iframe (could be inner iframe), or the original iframe if no inner DOM element is found.
      **/
     let getTrueFullScreenElement = fullScreenIframe => {
-      if (typeof fullScreenIframe.contentDocument !== 'undefined' && fullScreenIframe.contentDocument.mozFullScreenElement) {
+      if (typeof fullScreenIframe.contentDocument !== "undefined" && fullScreenIframe.contentDocument.mozFullScreenElement) {
         return getTrueFullScreenElement(fullScreenIframe.contentDocument.mozFullScreenElement);
       }
       return fullScreenIframe;
     }
 
     if (fullScreenElement.tagName === "IFRAME") {
       fullScreenElement = getTrueFullScreenElement(fullScreenElement);
     }
--- a/browser/modules/Social.jsm
+++ b/browser/modules/Social.jsm
@@ -228,18 +228,18 @@ this.OpenGraphBuilder = {
   generateEndpointURL(URLTemplate, pageData) {
     // support for existing oexchange style endpoints by supporting their
     // querystring arguments. parse the query string template and do
     // replacements where necessary the query names may be different than ours,
     // so we could see u=%{url} or url=%{url}
     let [endpointURL, queryString] = URLTemplate.split("?");
     let query = {};
     if (queryString) {
-      queryString.split('&').forEach(function(val) {
-        let [name, value] = val.split('=');
+      queryString.split("&").forEach(function(val) {
+        let [name, value] = val.split("=");
         let p = /%\{(.+)\}/.exec(value);
         if (!p) {
           // preserve non-template query vars
           query[name] = value;
         } else if (pageData[p[1]]) {
           if (p[1] == "previews")
             query[name] = pageData[p[1]][0];
           else
--- a/browser/modules/SocialService.jsm
+++ b/browser/modules/SocialService.jsm
@@ -70,17 +70,17 @@ var SocialServiceInternal = {
           return pref;
         }
       } catch (err) {
         Cu.reportError("SocialService: failed to load manifest: " + pref +
                        ", exception: " + err);
       }
     }
     let originUri = Services.io.newURI(origin);
-    return originUri.hostPort.replace('.', '-');
+    return originUri.hostPort.replace(".", "-");
   },
   orderedProviders(aCallback) {
     if (SocialServiceInternal.providerArray.length < 2) {
       schedule(function() {
         aCallback(SocialServiceInternal.providerArray);
       });
       return;
     }
@@ -153,17 +153,17 @@ XPCOMUtils.defineLazyGetter(SocialServic
 function getOriginActivationType(origin) {
   // if this is an about uri, treat it as a directory
   let URI = Services.io.newURI(origin);
   let principal = Services.scriptSecurityManager.createCodebasePrincipal(URI, {});
   if (Services.scriptSecurityManager.isSystemPrincipal(principal) || origin == "moz-safe-about:home") {
     return "internal";
   }
 
-  let directories = Services.prefs.getCharPref("social.directories").split(',');
+  let directories = Services.prefs.getCharPref("social.directories").split(",");
   if (directories.indexOf(origin) >= 0)
     return "directory";
 
   return "foreign";
 }
 
 var ActiveProviders = {
   get _providers() {
@@ -492,39 +492,39 @@ this.SocialService = {
         listener(topic, origin, providers);
       } catch (ex) {
         Components.utils.reportError("SocialService: provider listener threw an exception: " + ex);
       }
     }
   },
 
   _manifestFromData(type, data, installOrigin) {
-    let featureURLs = ['shareURL'];
-    let resolveURLs = featureURLs.concat(['postActivationURL']);
+    let featureURLs = ["shareURL"];
+    let resolveURLs = featureURLs.concat(["postActivationURL"]);
 
-    if (type == 'directory' || type == 'internal') {
+    if (type == "directory" || type == "internal") {
       // directory provided manifests must have origin in manifest, use that
-      if (!data['origin']) {
+      if (!data["origin"]) {
         Cu.reportError("SocialService.manifestFromData directory service provided manifest without origin.");
         return null;
       }
       installOrigin = data.origin;
     }
     // force/fixup origin
     let URI = Services.io.newURI(installOrigin);
     let principal = Services.scriptSecurityManager.createCodebasePrincipal(URI, {});
     data.origin = principal.origin;
 
     // iconURL and name are required
     let providerHasFeatures = featureURLs.some(url => data[url]);
     if (!providerHasFeatures) {
       Cu.reportError("SocialService.manifestFromData manifest missing required urls.");
       return null;
     }
-    if (!data['name'] || !data['iconURL']) {
+    if (!data["name"] || !data["iconURL"]) {
       Cu.reportError("SocialService.manifestFromData manifest missing name or iconURL.");
       return null;
     }
     for (let url of resolveURLs) {
       if (data[url]) {
         try {
           let resolved = Services.io.newURI(principal.URI.resolve(data[url]));
           if (!(resolved.schemeIs("http") || resolved.schemeIs("https"))) {
--- a/browser/modules/WindowsPreviewPerTab.jsm
+++ b/browser/modules/WindowsPreviewPerTab.jsm
@@ -271,17 +271,17 @@ PreviewController.prototype = {
       let winWidth = this.win.width;
       let winHeight = this.win.height;
 
       let composite = PageThumbs.createCanvas();
 
       // Use transparency, Aero glass is drawn black without it.
       composite.mozOpaque = false;
 
-      let ctx = composite.getContext('2d');
+      let ctx = composite.getContext("2d");
       let scale = this.screenPixelsPerCSSPixel / this.zoom;
 
       composite.width = winWidth * scale;
       composite.height = winHeight * scale;
 
       ctx.save();
       ctx.scale(scale, scale);
 
--- a/browser/modules/offlineAppCache.jsm
+++ b/browser/modules/offlineAppCache.jsm
@@ -1,15 +1,15 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 this.EXPORTED_SYMBOLS = ["OfflineAppCacheHelper"];
 
-Components.utils.import('resource://gre/modules/LoadContextInfo.jsm');
+Components.utils.import("resource://gre/modules/LoadContextInfo.jsm");
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 
 this.OfflineAppCacheHelper = {
   clear() {
     var cacheService = Cc["@mozilla.org/netwerk/cache-storage-service;1"].getService(Ci.nsICacheStorageService);
     var appCacheStorage = cacheService.appCacheStorage(LoadContextInfo.default, null);
--- a/browser/modules/test/browser_BrowserUITelemetry_syncedtabs.js
+++ b/browser/modules/test/browser_BrowserUITelemetry_syncedtabs.js
@@ -81,17 +81,17 @@ add_task(function* test_menu() {
     "synced-tabs": { open: { "toolbarbutton-subview": 1 } },
   });
 });
 
 add_task(function* test_sidebar() {
   // Reset BrowserUITelemetry's world.
   BUIT._countableEvents = {};
 
-  yield SidebarUI.show('viewTabsSidebar');
+  yield SidebarUI.show("viewTabsSidebar");
 
   let syncedTabsDeckComponent = SidebarUI.browser.contentWindow.syncedTabsDeckComponent;
 
   syncedTabsDeckComponent._accountStatus = () => Promise.resolve(true);
 
   // Once the tabs container has been selected (which here means "'selected'
   // added to the class list") we are ready to test.
   let container = SidebarUI.browser.contentDocument.querySelector(".tabs-container");
--- a/browser/modules/test/browser_SelfSupportBackend.js
+++ b/browser/modules/test/browser_SelfSupportBackend.js
@@ -29,20 +29,20 @@ function sendSessionRestoredNotification
 /**
  * Find a browser, with an IFRAME as parent, who has aURL as the source attribute.
  *
  * @param aURL The URL to look for to identify the browser.
  *
  * @returns {Object} The browser element or null on failure.
  */
 function findSelfSupportBrowser(aURL) {
-  let frames = Services.appShell.hiddenDOMWindow.document.querySelectorAll('iframe');
+  let frames = Services.appShell.hiddenDOMWindow.document.querySelectorAll("iframe");
   for (let frame of frames) {
     try {
-      let browser = frame.contentDocument.getElementById("win").querySelectorAll('browser')[0];
+      let browser = frame.contentDocument.getElementById("win").querySelectorAll("browser")[0];
       let url = browser.getAttribute("src");
       if (url == aURL) {
         return browser;
       }
     } catch (e) {
       continue;
     }
   }
--- a/browser/modules/test/browser_UsageTelemetry_content.js
+++ b/browser/modules/test/browser_UsageTelemetry_content.js
@@ -72,17 +72,17 @@ add_task(function* test_context_menu() {
 
   info("Validate the search metrics.");
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_CONTEXT_MENU, "search", 1);
   Assert.equal(Object.keys(scalars[SCALAR_CONTEXT_MENU]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  checkKeyedHistogram(search_hist, 'other-MozSearch.contextmenu', 1);
+  checkKeyedHistogram(search_hist, "other-MozSearch.contextmenu", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "contextmenu", null, {engine: "other-MozSearch"}]]);
 
   contextMenu.hidePopup();
   yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
@@ -108,17 +108,17 @@ add_task(function* test_about_newtab() {
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_ABOUT_NEWTAB, "search_enter", 1);
   Assert.equal(Object.keys(scalars[SCALAR_ABOUT_NEWTAB]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  checkKeyedHistogram(search_hist, 'other-MozSearch.newtab', 1);
+  checkKeyedHistogram(search_hist, "other-MozSearch.newtab", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "about_newtab", "enter", {engine: "other-MozSearch"}]]);
 
   yield BrowserTestUtils.removeTab(tab);
 });
--- a/browser/modules/test/browser_UsageTelemetry_content_aboutHome.js
+++ b/browser/modules/test/browser_UsageTelemetry_content_aboutHome.js
@@ -72,17 +72,17 @@ add_task(function* test_abouthome_simple
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_ABOUT_HOME, "search_enter", 1);
   Assert.equal(Object.keys(scalars[SCALAR_ABOUT_HOME]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  checkKeyedHistogram(search_hist, 'other-MozSearch.abouthome', 1);
+  checkKeyedHistogram(search_hist, "other-MozSearch.abouthome", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "about_home", "enter", {engine: "other-MozSearch"}]]);
 
   yield BrowserTestUtils.removeTab(tab);
 });
--- a/browser/modules/test/browser_UsageTelemetry_searchbar.js
+++ b/browser/modules/test/browser_UsageTelemetry_searchbar.js
@@ -98,17 +98,17 @@ add_task(function* test_plainQuery() {
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_SEARCHBAR, "search_enter", 1);
   Assert.equal(Object.keys(scalars[SCALAR_SEARCHBAR]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  checkKeyedHistogram(search_hist, 'other-MozSearch.searchbar', 1);
+  checkKeyedHistogram(search_hist, "other-MozSearch.searchbar", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "searchbar", "enter", {engine: "other-MozSearch"}]]);
 
   yield BrowserTestUtils.removeTab(tab);
 });
@@ -132,17 +132,17 @@ add_task(function* test_oneOff() {
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_SEARCHBAR, "search_oneoff", 1);
   Assert.equal(Object.keys(scalars[SCALAR_SEARCHBAR]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  checkKeyedHistogram(search_hist, 'other-MozSearch2.searchbar', 1);
+  checkKeyedHistogram(search_hist, "other-MozSearch2.searchbar", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "searchbar", "oneoff", {engine: "other-MozSearch2"}]]);
 
   yield BrowserTestUtils.removeTab(tab);
 });
@@ -177,18 +177,18 @@ add_task(function* test_suggestion() {
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_SEARCHBAR, "search_suggestion", 1);
   Assert.equal(Object.keys(scalars[SCALAR_SEARCHBAR]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  let searchEngineId = 'other-' + suggestionEngine.name;
-  checkKeyedHistogram(search_hist, searchEngineId + '.searchbar', 1);
+  let searchEngineId = "other-" + suggestionEngine.name;
+  checkKeyedHistogram(search_hist, searchEngineId + ".searchbar", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "searchbar", "suggestion", {engine: searchEngineId}]]);
 
   Services.search.currentEngine = previousEngine;
   Services.search.removeEngine(suggestionEngine);
--- a/browser/modules/test/browser_UsageTelemetry_urlbar.js
+++ b/browser/modules/test/browser_UsageTelemetry_urlbar.js
@@ -117,17 +117,17 @@ add_task(function* test_simpleQuery() {
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_URLBAR, "search_enter", 1);
   Assert.equal(Object.keys(scalars[SCALAR_URLBAR]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  checkKeyedHistogram(search_hist, 'other-MozSearch.urlbar', 1);
+  checkKeyedHistogram(search_hist, "other-MozSearch.urlbar", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "urlbar", "enter", {engine: "other-MozSearch"}]]);
 
   // Check the histograms as well.
   let resultIndexes = resultIndexHist.snapshot();
@@ -162,17 +162,17 @@ add_task(function* test_searchAlias() {
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_URLBAR, "search_alias", 1);
   Assert.equal(Object.keys(scalars[SCALAR_URLBAR]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  checkKeyedHistogram(search_hist, 'other-MozSearch.urlbar', 1);
+  checkKeyedHistogram(search_hist, "other-MozSearch.urlbar", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "urlbar", "alias", {engine: "other-MozSearch"}]]);
 
   // Check the histograms as well.
   let resultIndexes = resultIndexHist.snapshot();
@@ -210,17 +210,17 @@ add_task(function* test_oneOff() {
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_URLBAR, "search_oneoff", 1);
   Assert.equal(Object.keys(scalars[SCALAR_URLBAR]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  checkKeyedHistogram(search_hist, 'other-MozSearch.urlbar', 1);
+  checkKeyedHistogram(search_hist, "other-MozSearch.urlbar", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "urlbar", "oneoff", {engine: "other-MozSearch"}]]);
 
   // Check the histograms as well.
   let resultIndexes = resultIndexHist.snapshot();
@@ -269,18 +269,18 @@ add_task(function* test_suggestion() {
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_URLBAR, "search_suggestion", 1);
   Assert.equal(Object.keys(scalars[SCALAR_URLBAR]).length, 1,
                "This search must only increment one entry in the scalar.");
 
   // Make sure SEARCH_COUNTS contains identical values.
-  let searchEngineId = 'other-' + suggestionEngine.name;
-  checkKeyedHistogram(search_hist, searchEngineId + '.urlbar', 1);
+  let searchEngineId = "other-" + suggestionEngine.name;
+  checkKeyedHistogram(search_hist, searchEngineId + ".urlbar", 1);
 
   // Also check events.
   let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
   events = events.filter(e => e[1] == "navigation" && e[2] == "search");
   checkEvents(events, [["navigation", "search", "urlbar", "suggestion", {engine: searchEngineId}]]);
 
   // Check the histograms as well.
   let resultIndexes = resultIndexHist.snapshot();
--- a/browser/modules/test/browser_bug1319078.js
+++ b/browser/modules/test/browser_bug1319078.js
@@ -1,14 +1,14 @@
 "use strict";
 
-var gInvalidFormPopup = document.getElementById('invalid-form-popup');
+var gInvalidFormPopup = document.getElementById("invalid-form-popup");
 
 function checkPopupHide() {
-  ok(gInvalidFormPopup.state != 'showing' && gInvalidFormPopup.state != 'open',
+  ok(gInvalidFormPopup.state != "showing" && gInvalidFormPopup.state != "open",
      "[Test " + testId + "] The invalid form popup should not be shown");
 }
 
 var testId = 0;
 
 function incrementTest() {
   testId++;
   info("Starting next part of test");
@@ -18,32 +18,32 @@ function incrementTest() {
  * In this test, we check that no popup appears if the element display is none.
  */
 add_task(function* () {
   ok(gInvalidFormPopup,
      "The browser should have a popup to show when a form is invalid");
 
   incrementTest();
   let testPage =
-    'data:text/html,' +
+    "data:text/html," +
     '<form target="t"><input type="url"  placeholder="url" value="http://" style="display: none;"><input id="s" type="button" value="check"></form>';
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, testPage);
   yield BrowserTestUtils.synthesizeMouse("#s", 0, 0, {}, gBrowser.selectedBrowser);
 
   checkPopupHide();
   yield BrowserTestUtils.removeTab(tab);
 });
 
 /**
  * In this test, we check that no popup appears if the element visibility is hidden.
  */
 add_task(function* () {
   incrementTest();
   let testPage =
-    'data:text/html,' +
+    "data:text/html," +
     '<form target="t"><input type="url"  placeholder="url" value="http://" style="visibility: hidden;"><input id="s" type="button" value="check"></form>';
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, testPage);
   yield BrowserTestUtils.synthesizeMouse("#s", 0, 0, {}, gBrowser.selectedBrowser);
 
   checkPopupHide();
   yield BrowserTestUtils.removeTab(tab);
 });
 
--- a/browser/modules/test/xpcshell/test_AttributionCode.js
+++ b/browser/modules/test/xpcshell/test_AttributionCode.js
@@ -2,17 +2,17 @@
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 "use strict";
 
 const {interfaces: Ci, utils: Cu} = Components;
 
 Cu.import("resource://gre/modules/AppConstants.jsm");
 Cu.import("resource:///modules/AttributionCode.jsm");
-Cu.import('resource://gre/modules/osfile.jsm');
+Cu.import("resource://gre/modules/osfile.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 
 let validAttrCodes = [
   {code: "source%3Dgoogle.com%26medium%3Dorganic%26campaign%3D(not%20set)%26content%3D(not%20set)",
    parsed: {"source": "google.com", "medium": "organic",
             "campaign": "(not%20set)", "content": "(not%20set)"}},
   {code: "source%3Dgoogle.com%26medium%3Dorganic%26campaign%3D%26content%3D",
    parsed: {"source": "google.com", "medium": "organic"}},
--- a/browser/modules/test/xpcshell/test_DirectoryLinksProvider.js
+++ b/browser/modules/test/xpcshell/test_DirectoryLinksProvider.js
@@ -26,17 +26,17 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://testing-common/PlacesTestUtils.jsm");
 
 do_get_profile();
 
 const DIRECTORY_LINKS_FILE = "directoryLinks.json";
 const DIRECTORY_FRECENCY = 1000;
 const SUGGESTED_FRECENCY = Infinity;
 const kURLData = {"directory": [{"url":"http://example.com", "title":"LocalSource"}]};
-const kTestURL = 'data:application/json,' + JSON.stringify(kURLData);
+const kTestURL = "data:application/json," + JSON.stringify(kURLData);
 
 // DirectoryLinksProvider preferences
 const kLocalePref = DirectoryLinksProvider._observedPrefs.prefSelectedLocale;
 const kSourceUrlPref = DirectoryLinksProvider._observedPrefs.linksURL;
 const kPingUrlPref = "browser.newtabpage.directory.ping";
 const kNewtabEnhancedPref = "browser.newtabpage.enhanced";
 
 // httpd settings
@@ -290,17 +290,17 @@ add_task(function test_shouldUpdateSugge
   DirectoryLinksProvider._getCurrentTopSiteCount = origCurrentTopSiteCount;
 });
 
 add_task(function* test_updateSuggestedTile() {
   let topSites = ["site0.com", "1040.com", "site2.com", "hrblock.com", "site4.com", "freetaxusa.com", "site6.com"];
 
   // Initial setup
   let data = {"suggested": [suggestedTile1, suggestedTile2, suggestedTile3], "directory": [someOtherSite]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
 
   let testObserver = new TestFirstRun();
   DirectoryLinksProvider.addObserver(testObserver);
 
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
   let links = yield fetchData();
 
   let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
@@ -416,17 +416,17 @@ add_task(function* test_updateSuggestedT
   yield promiseCleanDirectoryLinksProvider();
   NewTabUtils.isTopPlacesSite = origIsTopPlacesSite;
   NewTabUtils.getProviderLinks = origGetProviderLinks;
   DirectoryLinksProvider._getCurrentTopSiteCount = origCurrentTopSiteCount;
 });
 
 add_task(function* test_suggestedLinksMap() {
   let data = {"suggested": [suggestedTile1, suggestedTile2, suggestedTile3, suggestedTile4], "directory": [someOtherSite]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
 
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
   let links = yield fetchData();
 
   // Ensure the suggested tiles were not considered directory tiles.
   do_check_eq(links.length, 1);
   let expected_data = [{url: "http://someothersite.com", title: "Not_A_Suggested_Site", frecency: DIRECTORY_FRECENCY, lastVisitDate: 1}];
   isIdentical(links, expected_data);
@@ -470,17 +470,17 @@ add_task(function* test_topSitesWithSugg
   NewTabUtils.getProviderLinks = function(provider) {
     return [];
   }
 
   // We start off with no top sites with suggested links.
   do_check_eq(DirectoryLinksProvider._topSitesWithSuggestedLinks.size, 0);
 
   let data = {"suggested": [suggestedTile1, suggestedTile2, suggestedTile3], "directory": [someOtherSite]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
 
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
   yield fetchData();
 
   // Check we've populated suggested links as expected.
   do_check_eq(DirectoryLinksProvider._suggestedLinks.size, 5);
 
   // When many sites change, we update _topSitesWithSuggestedLinks as expected.
@@ -796,17 +796,17 @@ add_task(function* test_DirectoryLinksPr
   let links = yield fetchData();
   do_check_eq(links.length, 1);
   let expectedData =  [{url: "http://example.com", title: "LocalSource", frecency: DIRECTORY_FRECENCY, lastVisitDate: 1}];
   isIdentical(links, expectedData);
 
   // tests these 2 things:
   // 1. _linksURL is properly set after the pref change
   // 2. invalid source url is correctly handled
-  let exampleUrl = 'http://localhost:56789/bad';
+  let exampleUrl = "http://localhost:56789/bad";
   yield promiseDirectoryDownloadOnPrefChange(kSourceUrlPref, exampleUrl);
   do_check_eq(DirectoryLinksProvider._linksURL, exampleUrl);
 
   // since the download fail, the directory file must remain the same
   let newLinks = yield fetchData();
   isIdentical(newLinks, expectedData);
 
   // now remove the file, and re-download
@@ -818,31 +818,31 @@ add_task(function* test_DirectoryLinksPr
 
   yield promiseCleanDirectoryLinksProvider();
 });
 
 add_task(function* test_DirectoryLinksProvider_getLinks_noDirectoryData() {
   let data = {
     "directory": [],
   };
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   let links = yield fetchData();
   do_check_eq(links.length, 0);
   yield promiseCleanDirectoryLinksProvider();
 });
 
 add_task(function* test_DirectoryLinksProvider_getLinks_badData() {
   let data = {
     "en-US": {
       "en-US": [{url: "http://example.com", title: "US"}],
     },
   };
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   // Make sure we get nothing for incorrectly formatted data
   let links = yield fetchData();
   do_check_eq(links.length, 0);
   yield promiseCleanDirectoryLinksProvider();
 });
 
@@ -965,17 +965,17 @@ add_task(function* test_DirectoryLinksPr
     {url: "ftp://example.com"},
     {url: "http://example.net"},
     {url: "javascript:5"},
     {url: "https://example.com"},
     {url: "httpJUNKjavascript:42"},
     {url: "data:text/plain,hi"},
     {url: "http/bork:eh"},
   ]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   let links = yield fetchData();
   do_check_eq(links.length, 2);
 
   // The only remaining url should be http and https
   do_check_eq(links[0].url, data["directory"][1].url);
   do_check_eq(links[1].url, data["directory"][3].url);
@@ -986,17 +986,17 @@ add_task(function* test_DirectoryLinksPr
     {url: "http://example.com", imageURI: "ftp://example.com"},
     {url: "http://example.com", imageURI: "http://example.net"},
     {url: "http://example.com", imageURI: "javascript:5"},
     {url: "http://example.com", imageURI: "https://example.com"},
     {url: "http://example.com", imageURI: "httpJUNKjavascript:42"},
     {url: "http://example.com", imageURI: "data:text/plain,hi"},
     {url: "http://example.com", imageURI: "http/bork:eh"},
   ]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   let links = yield fetchData();
   do_check_eq(links.length, 2);
 
   // The only remaining images should be https and data
   do_check_eq(links[0].imageURI, data["directory"][3].imageURI);
   do_check_eq(links[1].imageURI, data["directory"][5].imageURI);
@@ -1005,17 +1005,17 @@ add_task(function* test_DirectoryLinksPr
 add_task(function* test_DirectoryLinksProvider_getAllowedImages_base() {
   let data = {"directory": [
     {url: "http://example1.com", imageURI: "https://example.com"},
     {url: "http://example2.com", imageURI: "https://tiles.cdn.mozilla.net"},
     {url: "http://example3.com", imageURI: "https://tiles2.cdn.mozilla.net"},
     {url: "http://example4.com", enhancedImageURI: "https://mozilla.net"},
     {url: "http://example5.com", imageURI: "data:text/plain,hi"},
   ]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   // Pretend we're using the default pref to trigger base matching
   DirectoryLinksProvider.__linksURLModified = false;
 
   let links = yield fetchData();
   do_check_eq(links.length, 4);
 
@@ -1031,34 +1031,34 @@ add_task(function* test_DirectoryLinksPr
     {url: "http://example.com", enhancedImageURI: "ftp://example.com"},
     {url: "http://example.com", enhancedImageURI: "http://example.net"},
     {url: "http://example.com", enhancedImageURI: "javascript:5"},
     {url: "http://example.com", enhancedImageURI: "https://example.com"},
     {url: "http://example.com", enhancedImageURI: "httpJUNKjavascript:42"},
     {url: "http://example.com", enhancedImageURI: "data:text/plain,hi"},
     {url: "http://example.com", enhancedImageURI: "http/bork:eh"},
   ]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   let links = yield fetchData();
   do_check_eq(links.length, 2);
 
   // The only remaining enhancedImages should be http and https and data
   do_check_eq(links[0].enhancedImageURI, data["directory"][3].enhancedImageURI);
   do_check_eq(links[1].enhancedImageURI, data["directory"][5].enhancedImageURI);
 });
 
 add_task(function* test_DirectoryLinksProvider_getEnhancedLink() {
   let data = {"enhanced": [
     {url: "http://example.net", enhancedImageURI: "data:,net1"},
     {url: "http://example.com", enhancedImageURI: "data:,com1"},
     {url: "http://example.com", enhancedImageURI: "data:,com2"},
   ]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   let links = yield fetchData();
   do_check_eq(links.length, 0); // There are no directory links.
 
   function checkEnhanced(url, image) {
     let enhanced = DirectoryLinksProvider.getEnhancedLink({url});
     do_check_eq(enhanced && enhanced.enhancedImageURI, image);
@@ -1086,17 +1086,17 @@ add_task(function* test_DirectoryLinksPr
   checkEnhanced("http://example.org", undefined);
   checkEnhanced("http://localhost", undefined);
   checkEnhanced("http://127.0.0.1", undefined);
 
   // Make sure old data is not cached
   data = {"enhanced": [
     {url: "http://example.com", enhancedImageURI: "data:,fresh"},
   ]};
-  dataURI = 'data:application/json,' + JSON.stringify(data);
+  dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
   links = yield fetchData();
   do_check_eq(links.length, 0); // There are no directory links.
   checkEnhanced("http://example.net", undefined);
   checkEnhanced("http://example.com", "data:,fresh");
 });
 
 add_task(function* test_DirectoryLinksProvider_enhancedURIs() {
@@ -1108,17 +1108,17 @@ add_task(function* test_DirectoryLinksPr
   let data = {
     "suggested": [
       {url: "http://example.net", enhancedImageURI: "data:,net1", title:"SuggestedTitle", adgroup_name: "Test", frecent_sites: ["test.com"]}
     ],
     "directory": [
       {url: "http://example.net", enhancedImageURI: "data:,net2", title:"DirectoryTitle"}
     ]
   };
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   // Wait for links to get loaded
   let gLinks = NewTabUtils.links;
   gLinks.addProvider(DirectoryLinksProvider);
   gLinks.populateCache();
   yield new Promise(resolve => {
     NewTabUtils.allPages.register({
@@ -1182,17 +1182,17 @@ add_task(function* test_timeSensetiveSug
       start: startDate.toISOString(),
       end: endDate.toISOString(),
     }
   }, suggestedTile1);
 
   // Initial setup
   let topSites = ["site0.com", "1040.com", "site2.com", "hrblock.com", "site4.com", "freetaxusa.com", "site6.com"];
   let data = {"suggested": [suggestedTile], "directory": [someOtherSite]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
 
   let testObserver = new TestTimingRun();
   DirectoryLinksProvider.addObserver(testObserver);
 
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
   let links = yield fetchData();
 
   let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
@@ -1253,17 +1253,17 @@ add_task(function* test_timeSensetiveSug
   do_check_eq(DirectoryLinksProvider._updateSuggestedTile(), undefined);
 
   // set links back to contain directory tile only
   links.shift();
 
   // drop the end time - we should pick up the tile
   suggestedTile.time_limits.end = null;
   data = {"suggested": [suggestedTile], "directory": [someOtherSite]};
-  dataURI = 'data:application/json,' + JSON.stringify(data);
+  dataURI = "data:application/json," + JSON.stringify(data);
 
   // redownload json and getLinks to force time recomputation
   yield promiseDirectoryDownloadOnPrefChange(kSourceUrlPref, dataURI);
 
   // ensure that there's a link returned by _updateSuggestedTile and no timeout
   let deferred = Promise.defer();
   DirectoryLinksProvider.getLinks(() => {
     let link = DirectoryLinksProvider._updateSuggestedTile();
@@ -1275,17 +1275,17 @@ add_task(function* test_timeSensetiveSug
   });
   yield deferred.promise;
 
   // repeat the test for end time only
   suggestedTile.time_limits.start = null;
   suggestedTile.time_limits.end = (new Date(Date.now() + 3000)).toISOString();
 
   data = {"suggested": [suggestedTile], "directory": [someOtherSite]};
-  dataURI = 'data:application/json,' + JSON.stringify(data);
+  dataURI = "data:application/json," + JSON.stringify(data);
 
   // redownload json and call getLinks() to force time recomputation
   yield promiseDirectoryDownloadOnPrefChange(kSourceUrlPref, dataURI);
 
   // ensure that there's a link returned by _updateSuggestedTile and timeout set
   deferred = Promise.defer();
   DirectoryLinksProvider.getLinks(() => {
     let link = DirectoryLinksProvider._updateSuggestedTile();
@@ -1598,17 +1598,17 @@ add_task(function* test_DirectoryLinksPr
 add_task(function test_DirectoryLinksProvider_anonymous() {
   do_check_true(DirectoryLinksProvider._newXHR().mozAnon);
 });
 
 add_task(function* test_sanitizeExplanation() {
   // Note: this is a basic test to ensure we applied sanitization to the link explanation.
   // Full testing for appropriate sanitization is done in parser/xml/test/unit/test_sanitizer.js.
   let data = {"suggested": [suggestedTile5]};
-  let dataURI = 'data:application/json,' + encodeURIComponent(JSON.stringify(data));
+  let dataURI = "data:application/json," + encodeURIComponent(JSON.stringify(data));
 
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
   yield fetchData();
 
   let suggestedSites = [...DirectoryLinksProvider._suggestedLinks.keys()];
   do_check_eq(suggestedSites.indexOf("eviltarget.com"), 0);
   do_check_eq(suggestedSites.length, 1);
 
@@ -1620,17 +1620,17 @@ add_task(function* test_sanitizeExplanat
 add_task(function* test_inadjecentSites() {
   let suggestedTile = Object.assign({
     check_inadjacency: true
   }, suggestedTile1);
 
   // Initial setup
   let topSites = ["1040.com", "site2.com", "hrblock.com", "site4.com", "freetaxusa.com", "site6.com"];
   let data = {"suggested": [suggestedTile], "directory": [someOtherSite]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
 
   let testObserver = new TestFirstRun();
   DirectoryLinksProvider.addObserver(testObserver);
 
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
   let links = yield fetchData();
 
   let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
@@ -1654,17 +1654,17 @@ add_task(function* test_inadjecentSites(
 
   // loading inadjacent sites list function
   function setInadjacentSites(sites) {
     let badSiteB64 = [];
     sites.forEach(site => {
       badSiteB64.push(DirectoryLinksProvider._generateHash(site));
     });
     let theList = {"domains": badSiteB64};
-    let uri = 'data:application/json,' + JSON.stringify(theList);
+    let uri = "data:application/json," + JSON.stringify(theList);
     DirectoryLinksProvider._inadjacentSitesUrl = uri;
     return DirectoryLinksProvider._loadInadjacentSites();
   }
 
   // setup gLinks loader
   let gLinks = NewTabUtils.links;
   gLinks.addProvider(DirectoryLinksProvider);
 
@@ -1745,17 +1745,17 @@ add_task(function* test_inadjecentSites(
   // there should be no suggested link
   link = DirectoryLinksProvider._updateSuggestedTile();
   do_check_false(link);
   do_check_true(DirectoryLinksProvider._newTabHasInadjacentSite);
 
   // remove avoidInadjacentSites flag from suggested tile and reload json
   delete suggestedTile.check_inadjacency;
   data = {"suggested": [suggestedTile], "directory": [someOtherSite]};
-  dataURI = 'data:application/json,' + JSON.stringify(data);
+  dataURI = "data:application/json," + JSON.stringify(data);
   yield promiseDirectoryDownloadOnPrefChange(kSourceUrlPref, dataURI);
   yield fetchData();
 
   // inadjacent checking should be disabled
   do_check_false(DirectoryLinksProvider._avoidInadjacentSites);
   link = DirectoryLinksProvider._updateSuggestedTile();
   do_check_true(link);
   do_check_eq(link.url, "http://turbotax.com");
@@ -1790,17 +1790,17 @@ add_task(function* test_inadjecentSites(
   DirectoryLinksProvider._getCurrentTopSiteCount = origCurrentTopSiteCount;
   yield promiseCleanDirectoryLinksProvider();
 });
 
 add_task(function* test_blockSuggestedTiles() {
   // Initial setup
   let topSites = ["site0.com", "1040.com", "site2.com", "hrblock.com", "site4.com", "freetaxusa.com", "site6.com"];
   let data = {"suggested": [suggestedTile1, suggestedTile2, suggestedTile3], "directory": [someOtherSite]};
-  let dataURI = 'data:application/json,' + JSON.stringify(data);
+  let dataURI = "data:application/json," + JSON.stringify(data);
 
   yield promiseSetupDirectoryLinksProvider({linksURL: dataURI});
   let links = yield fetchData();
 
   let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
   NewTabUtils.isTopPlacesSite = function(site) {
     return topSites.indexOf(site) >= 0;
   }
--- a/devtools/client/inspector/inspector.xhtml
+++ b/devtools/client/inspector/inspector.xhtml
@@ -3,17 +3,16 @@
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 <!DOCTYPE html>
 
 <html xmlns="http://www.w3.org/1999/xhtml" dir="">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 
-  <link rel="stylesheet" href="resource://devtools/client/shared/widgets/widgets.css"/>
   <link rel="stylesheet" href="chrome://devtools/skin/widgets.css"/>
   <link rel="stylesheet" href="chrome://devtools/skin/inspector.css"/>
   <link rel="stylesheet" href="chrome://devtools/skin/rules.css"/>
   <link rel="stylesheet" href="chrome://devtools/skin/computed.css"/>
   <link rel="stylesheet" href="chrome://devtools/skin/fonts.css"/>
   <link rel="stylesheet" href="chrome://devtools/skin/boxmodel.css"/>
   <link rel="stylesheet" href="chrome://devtools/skin/layout.css"/>
   <link rel="stylesheet" href="chrome://devtools/skin/animationinspector.css"/>
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -807,46 +807,46 @@ private:
         (DonePrerollingAudio() || mMaster->IsWaitingAudioData()) &&
         (DonePrerollingVideo() || mMaster->IsWaitingVideoData())) {
       mIsPrerolling = false;
       // Check if we can start playback.
       mMaster->ScheduleStateMachine();
     }
   }
 
-  void EnterDormant()
-  {
-    SetState<DormantState>();
-  }
-
   void StartDormantTimer()
   {
     if (!mMaster->mMediaSeekable) {
       // Don't enter dormant if the media is not seekable because we need to
       // seek when exiting dormant.
       return;
     }
 
+    if (mMaster->mMinimizePreroll) {
+      SetState<DormantState>();
+      return;
+    }
+
     auto timeout = MediaPrefs::DormantOnPauseTimeout();
     if (timeout < 0) {
       // Disabled when timeout is negative.
       return;
     } else if (timeout == 0) {
       // Enter dormant immediately without scheduling a timer.
-      EnterDormant();
+      SetState<DormantState>();
       return;
     }
 
     TimeStamp target = TimeStamp::Now() +
       TimeDuration::FromMilliseconds(timeout);
 
     mDormantTimer.Ensure(target,
       [this] () {
         mDormantTimer.CompleteRequest();
-        EnterDormant();
+        SetState<DormantState>();
       }, [this] () {
         mDormantTimer.CompleteRequest();
       });
   }
 
   // Time at which we started decoding.
   TimeStamp mDecodeStartTime;
 
new file mode 100644
--- /dev/null
+++ b/dom/media/tests/mochitest/addTurnsSelfsignedCert.js
@@ -0,0 +1,26 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
+
+// This is only usable from the parent process, even for doing simple stuff like
+// serializing a cert.
+var gCertMaker = Cc["@mozilla.org/security/x509certdb;1"].
+              getService(Ci.nsIX509CertDB);
+
+var gCertOverrides = Cc["@mozilla.org/security/certoverride;1"].
+              getService(Ci.nsICertOverrideService);
+
+
+addMessageListener('add-turns-certs', certs => {
+  var port = 5349;
+  certs.forEach(certDescription => {
+    var cert = gCertMaker.constructX509FromBase64(certDescription.cert);
+    gCertOverrides.rememberValidityOverride(certDescription.hostname, port,
+        cert, Ci.nsICertOverrideService.ERROR_UNTRUSTED, false);
+  });
+  sendAsyncMessage('certs-added');
+});
--- a/dom/media/tests/mochitest/mochitest.ini
+++ b/dom/media/tests/mochitest/mochitest.ini
@@ -8,16 +8,17 @@ support-files =
   network.js
   nonTrickleIce.js
   pc.js
   templates.js
   NetworkPreparationChromeScript.js
   blacksilence.js
   turnConfig.js
   sdpUtils.js
+  addTurnsSelfsignedCert.js
   !/dom/canvas/test/captureStream_common.js
   !/dom/canvas/test/webgl-mochitest/webgl-util.js
   !/dom/media/test/manifest.js
   !/dom/media/test/320x240.ogv
   !/dom/media/test/r11025_s16_c1.wav
   !/dom/media/test/bug461281.ogg
   !/dom/media/test/seek.webm
   !/dom/media/test/gizmo.mp4
@@ -92,16 +93,18 @@ skip-if = android_version == '18' # andr
 [test_peerConnection_basicAudio.html]
 skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_peerConnection_basicAudioNATSrflx.html]
 skip-if = toolkit == 'android' # websockets don't work on android (bug 1266217)
 [test_peerConnection_basicAudioNATRelay.html]
 skip-if = toolkit == 'android' # websockets don't work on android (bug 1266217)
 [test_peerConnection_basicAudioNATRelayTCP.html]
 skip-if = toolkit == 'android' # websockets don't work on android (bug 1266217)
+[test_peerConnection_basicAudioNATRelayTLS.html]
+skip-if = true # need pyopenssl on builders, see bug 1323439 # toolkit == 'android' # websockets don't work on android (bug 1266217)
 [test_peerConnection_basicAudioRequireEOC.html]
 skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_peerConnection_basicAudioPcmaPcmuOnly.html]
 skip-if = android_version == '18'
 [test_peerConnection_basicAudioDynamicPtMissingRtpmap.html]
 skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_peerConnection_basicAudioVideo.html]
 skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
--- a/dom/media/tests/mochitest/pc.js
+++ b/dom/media/tests/mochitest/pc.js
@@ -1898,16 +1898,43 @@ var scriptsReady = Promise.all([
 
 function createHTML(options) {
   return scriptsReady.then(() => realCreateHTML(options));
 }
 
 var iceServerWebsocket;
 var iceServersArray = [];
 
+var addTurnsSelfsignedCerts = () => {
+  var gUrl = SimpleTest.getTestFileURL('addTurnsSelfsignedCert.js');
+  var gScript = SpecialPowers.loadChromeScript(gUrl);
+  var certs = [];
+  // If the ICE server is running TURNS, and includes a "cert" attribute in
+  // its JSON, we set up an override that will forgive things like
+  // self-signed for it.
+  iceServersArray.forEach(iceServer => {
+    if (iceServer.hasOwnProperty("cert")) {
+      iceServer.urls.forEach(url => {
+        if (url.startsWith("turns:")) {
+          // Assumes no port or params!
+          certs.push({"cert": iceServer.cert, "hostname": url.substr(6)});
+        }
+      });
+    }
+  });
+
+  return new Promise((resolve, reject) => {
+    gScript.addMessageListener('certs-added', () => {
+      resolve();
+    });
+
+    gScript.sendAsyncMessage('add-turns-certs', certs);
+  });
+};
+
 var setupIceServerConfig = useIceServer => {
   // We disable ICE support for HTTP proxy when using a TURN server, because
   // mochitest uses a fake HTTP proxy to serve content, which will eat our STUN
   // packets for TURN TCP.
   var enableHttpProxy = enable =>
     SpecialPowers.pushPrefEnv(
       {'set': [['media.peerconnection.disable_http_proxy', !enable]]});
 
@@ -1937,17 +1964,18 @@ var setupIceServerConfig = useIceServer 
 
   if (!useIceServer) {
     info("Skipping ICE Server for this test");
     return enableHttpProxy(true);
   }
 
   return enableHttpProxy(false)
     .then(spawnIceServer)
-    .then(iceServersStr => { iceServersArray = JSON.parse(iceServersStr); });
+    .then(iceServersStr => { iceServersArray = JSON.parse(iceServersStr); })
+    .then(addTurnsSelfsignedCerts);
 };
 
 function runNetworkTest(testFunction, fixtureOptions) {
   fixtureOptions = fixtureOptions || {}
   return scriptsReady.then(() =>
     runTestWhenReady(options =>
       startNetworkAndTest()
         .then(() => setupIceServerConfig(fixtureOptions.useIceServer))
copy from dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html
copy to dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTLS.html
--- a/dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTLS.html
@@ -3,27 +3,28 @@
 <head>
   <script type="application/javascript" src="pc.js"></script>
 </head>
 <body>
 <pre id="test">
 <script type="application/javascript">
   createHTML({
     bug: "1231975",
-    title: "Basic audio-only peer connection with port dependent NAT that blocks UDP"
+    title: "Basic audio-only peer connection with port dependent NAT that blocks STUN"
   });
 
   var test;
   runNetworkTest(options => {
     SpecialPowers.pushPrefEnv(
       {
         'set': [
           ['media.peerconnection.nat_simulator.filtering_type', 'PORT_DEPENDENT'],
           ['media.peerconnection.nat_simulator.mapping_type', 'PORT_DEPENDENT'],
-          ['media.peerconnection.nat_simulator.block_udp', true]
+          ['media.peerconnection.nat_simulator.block_udp', true],
+          ['media.peerconnection.nat_simulator.block_tcp', true]
         ]
       }, function (options) {
         options = options || {};
         options.expectedLocalCandidateType = "relayed-tcp";
         options.expectedRemoteCandidateType = "relayed-tcp";
         // No reason to wait for gathering to complete like the other NAT tests,
         // since relayed-tcp is the only thing that can work.
         test = new PeerConnectionTest(options);
--- a/dom/network/TCPSocketParent.cpp
+++ b/dom/network/TCPSocketParent.cpp
@@ -142,19 +142,28 @@ TCPSocketParent::RecvOpenBind(const nsCS
   nsCOMPtr<nsISocketTransportService> sts =
     do_GetService("@mozilla.org/network/socket-transport-service;1", &rv);