Bug 1355056 - replace (function(args) { /* do stuff using this */ }).bind(this) with arrow functions, r=jaws.
authorFlorian Queze <florian@queze.net>
Thu, 27 Apr 2017 00:25:45 +0200
changeset 355101 0f97f76c0b34673f2bf31c96eb1285416836f565
parent 355100 2318d492b17f539d7e9ba8b2417f6b46c3664493
child 355102 27114f4cd6e7a306139d59a9b959e0183e5613ab
push id31721
push usercbook@mozilla.com
push dateThu, 27 Apr 2017 14:32:57 +0000
treeherdermozilla-central@c0d35b1c5ab5 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjaws
bugs1355056
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1355056 - replace (function(args) { /* do stuff using this */ }).bind(this) with arrow functions, r=jaws.
accessible/tests/mochitest/events/test_mutation.html
addon-sdk/source/lib/sdk/simple-storage.js
browser/base/content/browser-fullZoom.js
browser/base/content/browser-places.js
browser/base/content/browser-thumbnails.js
browser/base/content/newtab/undo.js
browser/base/content/sync/aboutSyncTabs.js
browser/base/content/test/general/browser_fullscreen-window-open.js
browser/components/customizableui/CustomizableUI.jsm
browser/components/customizableui/CustomizableWidgets.jsm
browser/components/customizableui/CustomizeMode.jsm
browser/components/feeds/FeedWriter.js
browser/components/migration/FirefoxProfileMigrator.js
browser/components/migration/SafariProfileMigrator.js
browser/components/places/content/places.js
browser/components/preferences/in-content-old/advanced.js
browser/components/preferences/in-content-old/applications.js
browser/components/preferences/in-content-old/sync.js
browser/components/preferences/in-content/advanced.js
browser/components/preferences/in-content/applications.js
browser/components/preferences/in-content/sync.js
browser/components/search/content/search.xml
browser/components/translation/BingTranslator.jsm
browser/components/translation/YandexTranslator.jsm
browser/extensions/activity-stream/lib/Store.jsm
browser/extensions/pdfjs/content/PdfStreamConverter.jsm
browser/extensions/pdfjs/content/build/pdf.js
browser/extensions/pdfjs/content/build/pdf.worker.js
browser/extensions/pdfjs/content/web/debugger.js
browser/extensions/pdfjs/content/web/viewer.js
browser/modules/DirectoryLinksProvider.jsm
browser/modules/SocialService.jsm
devtools/client/commandline/test/helpers.js
devtools/client/commandline/test/mockCommands.js
devtools/client/debugger/new/pretty-print-worker.js
devtools/client/devtools-startup.js
devtools/client/inspector/rules/views/rule-editor.js
devtools/client/performance/modules/logic/telemetry.js
devtools/client/styleeditor/StyleEditorUI.jsm
devtools/shared/gcli/commands/calllog.js
devtools/shared/gcli/source/lib/gcli/cli.js
devtools/shared/gcli/source/lib/gcli/commands/commands.js
devtools/shared/gcli/source/lib/gcli/commands/help.js
devtools/shared/gcli/source/lib/gcli/commands/preflist.js
devtools/shared/gcli/source/lib/gcli/connectors/connectors.js
devtools/shared/gcli/source/lib/gcli/converters/converters.js
devtools/shared/gcli/source/lib/gcli/fields/selection.js
devtools/shared/gcli/source/lib/gcli/languages/command.js
devtools/shared/gcli/source/lib/gcli/languages/javascript.js
devtools/shared/gcli/source/lib/gcli/languages/languages.js
devtools/shared/gcli/source/lib/gcli/mozui/completer.js
devtools/shared/gcli/source/lib/gcli/mozui/inputter.js
devtools/shared/gcli/source/lib/gcli/mozui/tooltip.js
devtools/shared/gcli/source/lib/gcli/settings.js
devtools/shared/gcli/source/lib/gcli/system.js
devtools/shared/gcli/source/lib/gcli/types/array.js
devtools/shared/gcli/source/lib/gcli/types/delegate.js
devtools/shared/gcli/source/lib/gcli/types/resource.js
devtools/shared/gcli/source/lib/gcli/types/selection.js
devtools/shared/gcli/source/lib/gcli/types/types.js
devtools/shared/gcli/source/lib/gcli/types/union.js
devtools/shared/gcli/source/lib/gcli/types/url.js
devtools/shared/gcli/source/lib/gcli/ui/focus.js
devtools/shared/gcli/source/lib/gcli/ui/menu.js
devtools/shared/gcli/source/lib/gcli/util/host.js
devtools/shared/pretty-fast/pretty-fast.js
devtools/shared/touch/simulator-core.js
dom/animation/test/css-animations/file_event-dispatch.html
dom/animation/test/css-animations/file_event-order.html
dom/animation/test/css-transitions/file_event-dispatch.html
dom/base/DOMRequestHelper.jsm
dom/base/IndexedDBHelper.jsm
dom/browser-element/BrowserElementChildPreload.js
dom/imptests/idlharness.js
dom/imptests/testharness.js
dom/indexedDB/test/unit/test_lowDiskSpace.js
dom/manifest/Manifest.jsm
dom/media/test/manifest.js
dom/notification/NotificationDB.jsm
dom/notification/NotificationStorage.js
dom/presentation/tests/xpcshell/test_multicast_dns_device_provider.js
dom/system/NetworkGeolocationProvider.js
layout/style/crashtests/1017798-1.html
layout/style/test/test_redundant_font_download.html
media/webrtc/trunk/webrtc/tools/rtcbot/botmanager.js
media/webrtc/trunk/webrtc/tools/rtcbot/test.js
mobile/android/chrome/content/CastingApps.js
mobile/android/chrome/content/FeedHandler.js
mobile/android/chrome/content/InputWidgetHelper.js
mobile/android/chrome/content/Linkify.js
mobile/android/chrome/content/aboutAddons.js
mobile/android/chrome/content/browser.js
mobile/android/chrome/content/config.js
mobile/android/components/SessionStore.js
mobile/android/modules/JNI.jsm
mobile/android/modules/MediaPlayerApp.jsm
netwerk/protocol/http/UserAgentUpdates.jsm
services/cloudsync/CloudSyncBookmarks.jsm
services/cloudsync/CloudSyncPlacesWrapper.jsm
services/common/modules-testing/storageserver.js
services/sync/Weave.js
services/sync/modules/addonsreconciler.js
services/sync/modules/addonutils.js
services/sync/modules/browserid_identity.js
services/sync/modules/resource.js
services/sync/modules/service.js
services/sync/tps/extensions/tps/resource/tps.jsm
testing/mochitest/browser-test.js
testing/specialpowers/content/MockColorPicker.jsm
testing/xpcshell/node-http2/lib/protocol/flow.js
testing/xpcshell/node-http2/test/flow.js
toolkit/components/asyncshutdown/AsyncShutdown.jsm
toolkit/components/crashes/CrashManager.jsm
toolkit/components/ctypes/tests/unit/head.js
toolkit/components/jsdownloads/src/DownloadLegacy.js
toolkit/components/places/BookmarkJSONUtils.jsm
toolkit/components/places/PlacesBackups.jsm
toolkit/components/places/nsPlacesExpiration.js
toolkit/components/places/tests/bookmarks/test_sync_fields.js
toolkit/components/reader/AboutReader.jsm
toolkit/components/reader/Readability.js
toolkit/components/search/nsSearchService.js
toolkit/components/search/nsSearchSuggestions.js
toolkit/components/telemetry/TelemetrySession.jsm
toolkit/components/telemetry/TelemetryStorage.jsm
toolkit/components/thumbnails/PageThumbs.jsm
toolkit/components/thumbnails/test/head.js
toolkit/content/widgets/videocontrols.xml
toolkit/modules/PropertyListUtils.jsm
toolkit/modules/Sntp.jsm
toolkit/modules/secondscreen/RokuApp.jsm
toolkit/modules/secondscreen/SimpleServiceDiscovery.jsm
toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
toolkit/mozapps/downloads/nsHelperAppDlg.js
toolkit/mozapps/extensions/LightweightThemeManager.jsm
toolkit/mozapps/extensions/content/extensions.js
toolkit/mozapps/update/tests/unit_aus_update/downloadInterruptedRecovery.js
--- a/accessible/tests/mochitest/events/test_mutation.html
+++ b/accessible/tests/mochitest/events/test_mutation.html
@@ -376,17 +376,17 @@
         return "show hidden parent of visible child";
       }
     }
 
     function hideNDestroyDoc()
     {
       this.txt = null;
       this.eventSeq = [
-        new invokerChecker(EVENT_HIDE, function() { return this.txt; }.bind(this))
+        new invokerChecker(EVENT_HIDE, () => { return this.txt; })
       ];
 
       this.invoke = function hideNDestroyDoc_invoke()
       {
         this.txt = getAccessible('c5').firstChild.firstChild;
         this.txt.DOMNode.remove();
       }
 
@@ -400,17 +400,17 @@
         return "remove text node and destroy a document on hide event";
       }
     }
 
     function hideHideNDestroyDoc()
     {
       this.target = null;
       this.eventSeq = [
-        new invokerChecker(EVENT_HIDE, function() { return this.target; }.bind(this))
+        new invokerChecker(EVENT_HIDE, () => { return this.target; })
       ];
 
       this.invoke = function hideHideNDestroyDoc_invoke()
       {
         var doc = getAccessible('c6').firstChild;
         var l1 = doc.firstChild;
         this.target = l1.firstChild;
         var l2 = doc.lastChild;
--- a/addon-sdk/source/lib/sdk/simple-storage.js
+++ b/addon-sdk/source/lib/sdk/simple-storage.js
@@ -157,22 +157,22 @@ JsonStore.prototype = {
     // If the store is over quota, don't write.  The current under-quota state
     // should persist.
     if (this.quotaUsage > 1)
       return;
 
     // Finally, write.
     let stream = file.open(this.filename, "w");
     try {
-      stream.writeAsync(JSON.stringify(this.root), function writeAsync(err) {
+      stream.writeAsync(JSON.stringify(this.root), err => {
         if (err)
           console.error("Error writing simple storage file: " + this.filename);
         else if (this.onWrite)
           this.onWrite(this);
-      }.bind(this));
+      });
     }
     catch (err) {
       // writeAsync closes the stream after it's done, so only close on error.
       stream.close();
     }
   }
 };
 
--- a/browser/base/content/browser-fullZoom.js
+++ b/browser/base/content/browser-fullZoom.js
@@ -150,20 +150,20 @@ var FullZoom = {
 
     // If the current page doesn't have a site-specific preference, then its
     // zoom should be set to the new global preference now that the global
     // preference has changed.
     let hasPref = false;
     let token = this._getBrowserToken(browser);
     this._cps2.getByDomainAndName(browser.currentURI.spec, this.name, ctxt, {
       handleResult() { hasPref = true; },
-      handleCompletion: function() {
+      handleCompletion: () => {
         if (!hasPref && token.isCurrent)
           this._applyPrefToZoom(undefined, browser);
-      }.bind(this)
+      }
     });
   },
 
   // location change observer
 
   /**
    * Called when the location of a tab changes.
    * When that happens, we need to update the current zoom level if appropriate.
@@ -219,24 +219,24 @@ var FullZoom = {
       return;
     }
 
     // It's not cached, so we have to asynchronously fetch it.
     let value = undefined;
     let token = this._getBrowserToken(browser);
     this._cps2.getByDomainAndName(aURI.spec, this.name, ctxt, {
       handleResult(resultPref) { value = resultPref.value; },
-      handleCompletion: function() {
+      handleCompletion: () => {
         if (!token.isCurrent) {
           this._notifyOnLocationChange(browser);
           return;
         }
         this._applyPrefToZoom(value, browser,
                               this._notifyOnLocationChange.bind(this, browser));
-      }.bind(this)
+      }
     });
   },
 
   // update state of zoom type menu item
 
   updateMenu: function FullZoom_updateMenu() {
     var menuItem = document.getElementById("toggle_zoom");
 
@@ -359,36 +359,36 @@ var FullZoom = {
     if (!this.siteSpecific ||
         gInPrintPreviewMode ||
         browser.isSyntheticDocument)
       return;
 
     this._cps2.set(browser.currentURI.spec, this.name,
                    ZoomManager.getZoomForBrowser(browser),
                    this._loadContextFromBrowser(browser), {
-      handleCompletion: function() {
+      handleCompletion: () => {
         this._isNextContentPrefChangeInternal = true;
-      }.bind(this),
+      },
     });
   },
 
   /**
    * Removes from the content prefs store the zoom level of the given browser.
    *
    * @param browser  The zoom of this browser will be removed.  Required.
    */
   _removePref: function FullZoom__removePref(browser) {
     Services.obs.notifyObservers(browser, "browser-fullZoom:zoomReset");
     if (browser.isSyntheticDocument)
       return;
     let ctxt = this._loadContextFromBrowser(browser);
     this._cps2.removeByDomainAndName(browser.currentURI.spec, this.name, ctxt, {
-      handleCompletion: function() {
+      handleCompletion: () => {
         this._isNextContentPrefChangeInternal = true;
-      }.bind(this),
+      },
     });
   },
 
   // Utilities
 
   /**
    * Returns the zoom change token of the given browser.  Asynchronous
    * operations that access the given browser's zoom should use this method to
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -234,28 +234,28 @@ var StarUI = {
     if (this._overlayLoaded) {
       this._doShowEditBookmarkPanel(aNode, aAnchorElement, aPosition);
       return;
     }
 
     this._overlayLoading = true;
     document.loadOverlay(
       "chrome://browser/content/places/editBookmarkOverlay.xul",
-      (function(aSubject, aTopic, aData) {
+      (aSubject, aTopic, aData) => {
         // Move the header (star, title, button) into the grid,
         // so that it aligns nicely with the other items (bug 484022).
         let header = this._element("editBookmarkPanelHeader");
         let rows = this._element("editBookmarkPanelGrid").lastChild;
         rows.insertBefore(header, rows.firstChild);
         header.hidden = false;
 
         this._overlayLoading = false;
         this._overlayLoaded = true;
         this._doShowEditBookmarkPanel(aNode, aAnchorElement, aPosition);
-      }).bind(this)
+      }
     );
   }),
 
   _doShowEditBookmarkPanel: Task.async(function* (aNode, aAnchorElement, aPosition) {
     if (this.panel.state != "closed")
       return;
 
     this._blockCommands(); // un-done in the popuphidden handler
--- a/browser/base/content/browser-thumbnails.js
+++ b/browser/base/content/browser-thumbnails.js
@@ -128,20 +128,20 @@ var gBrowserThumbnails = {
   },
 
   _delayedCapture: function Thumbnails_delayedCapture(aBrowser) {
     if (this._timeouts.has(aBrowser))
       clearTimeout(this._timeouts.get(aBrowser));
     else
       aBrowser.addEventListener("scroll", this, true);
 
-    let timeout = setTimeout(function() {
+    let timeout = setTimeout(() => {
       this._clearTimeout(aBrowser);
       this._capture(aBrowser);
-    }.bind(this), this._captureDelayMS);
+    }, this._captureDelayMS);
 
     this._timeouts.set(aBrowser, timeout);
   },
 
   _shouldCapture: function Thumbnails_shouldCapture(aBrowser, aCallback) {
     // Capture only if it's the currently selected tab.
     if (aBrowser != gBrowser.selectedBrowser) {
       aCallback(false);
--- a/browser/base/content/newtab/undo.js
+++ b/browser/base/content/newtab/undo.js
@@ -101,16 +101,16 @@ var gUndoDialog = {
     gUpdater.updateGrid();
     this.hide();
   },
 
   /**
    * Undo all blocked sites.
    */
   _undoAll: function UndoDialog_undoAll() {
-    NewTabUtils.undoAll(function() {
+    NewTabUtils.undoAll(() => {
       gUpdater.updateGrid();
       this.hide();
-    }.bind(this));
+    });
   }
 };
 
 gUndoDialog.init();
--- a/browser/base/content/sync/aboutSyncTabs.js
+++ b/browser/base/content/sync/aboutSyncTabs.js
@@ -242,17 +242,17 @@ var RemoteTabViewer = {
         }
         let tab = this.createItem(attrs);
         list.appendChild(tab);
       }, this);
     }
   },
 
   _generateCloudSyncTabList() {
-    let updateTabList = function(remoteTabs) {
+    let updateTabList = remoteTabs => {
       let list = this._tabsList;
 
       for (let client of remoteTabs) {
         let clientAttrs = {
           type: "client",
           clientName: client.name,
         };
 
@@ -265,17 +265,17 @@ var RemoteTabViewer = {
             title: tab.title,
             url: tab.url,
             icon: this.getIcon(tab.icon),
           };
           let tabEnt = this.createItem(tabAttrs);
           list.appendChild(tabEnt);
         }
       }
-    }.bind(this);
+    };
 
     return CloudSync().tabs.getRemoteTabs()
                            .then(updateTabList, Promise.reject.bind(Promise));
   },
 
   adjustContextMenu(event) {
     let mode = "all";
     switch (this._tabsList.selectedItems.length) {
--- a/browser/base/content/test/general/browser_fullscreen-window-open.js
+++ b/browser/base/content/test/general/browser_fullscreen-window-open.js
@@ -322,20 +322,20 @@ WindowListener.prototype = {
       if (this.callback_onSuccess) {
         this.callback_onSuccess();
       }
 
       domwindow.removeEventListener("load", onLoad, true);
 
       // wait for trasition to fullscreen on OSX Lion later
       if (isOSX) {
-        setTimeout(function() {
+        setTimeout(() => {
           domwindow.close();
           executeSoon(this.callBack_onFinalize);
-        }.bind(this), 3000);
+        }, 3000);
       } else {
         domwindow.close();
         executeSoon(this.callBack_onFinalize);
       }
     };
     domwindow.addEventListener("load", onLoad, true);
   },
   onCloseWindow(aXULWindow) {},
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -4381,23 +4381,23 @@ OverflowableToolbar.prototype = {
     if (aNode.getAttribute("overflowedItem") == "true") {
       return this._list;
     }
     return this._target;
   },
 
   _hideTimeoutId: null,
   _showWithTimeout() {
-    this.show().then(function() {
+    this.show().then(() => {
       let window = this._toolbar.ownerGlobal;
       if (this._hideTimeoutId) {
         window.clearTimeout(this._hideTimeoutId);
       }
       this._hideTimeoutId = window.setTimeout(() => {
         if (!this._panel.firstChild.matches(":hover")) {
           this._panel.hidePopup();
         }
       }, OVERFLOW_PANEL_HIDE_DELAY_MS);
-    }.bind(this));
+    });
   },
 };
 
 CustomizableUIInternal.initialize();
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -694,63 +694,63 @@ const CustomizableWidgets = [
         let btnNode = aDocument.createElementNS(kNSXUL, "toolbarbutton");
         setAttributes(btnNode, aButton);
         node.appendChild(btnNode);
       });
 
       updateCombinedWidgetStyle(node, this.currentArea, true);
 
       let listener = {
-        onWidgetAdded: function(aWidgetId, aArea, aPosition) {
+        onWidgetAdded: (aWidgetId, aArea, aPosition) => {
           if (aWidgetId != this.id)
             return;
 
           updateCombinedWidgetStyle(node, aArea, true);
-        }.bind(this),
+        },
 
-        onWidgetRemoved: function(aWidgetId, aPrevArea) {
+        onWidgetRemoved: (aWidgetId, aPrevArea) => {
           if (aWidgetId != this.id)
             return;
 
           // When a widget is demoted to the palette ('removed'), it's visual
           // style should change.
           updateCombinedWidgetStyle(node, null, true);
-        }.bind(this),
+        },
 
-        onWidgetReset: function(aWidgetNode) {
+        onWidgetReset: aWidgetNode => {
           if (aWidgetNode != node)
             return;
           updateCombinedWidgetStyle(node, this.currentArea, true);
-        }.bind(this),
+        },
 
-        onWidgetUndoMove: function(aWidgetNode) {
+        onWidgetUndoMove: aWidgetNode => {
           if (aWidgetNode != node)
             return;
           updateCombinedWidgetStyle(node, this.currentArea, true);
-        }.bind(this),
+        },
 
-        onWidgetMoved: function(aWidgetId, aArea) {
+        onWidgetMoved: (aWidgetId, aArea) => {
           if (aWidgetId != this.id)
             return;
           updateCombinedWidgetStyle(node, aArea, true);
-        }.bind(this),
+        },
 
-        onWidgetInstanceRemoved: function(aWidgetId, aDoc) {
+        onWidgetInstanceRemoved: (aWidgetId, aDoc) => {
           if (aWidgetId != this.id || aDoc != aDocument)
             return;
 
           CustomizableUI.removeListener(listener);
-        }.bind(this),
+        },
 
-        onWidgetDrag: function(aWidgetId, aArea) {
+        onWidgetDrag: (aWidgetId, aArea) => {
           if (aWidgetId != this.id)
             return;
           aArea = aArea || this.currentArea;
           updateCombinedWidgetStyle(node, aArea, true);
-        }.bind(this)
+        }
       };
       CustomizableUI.addListener(listener);
 
       return node;
     }
   }, {
     id: "edit-controls",
     type: "custom",
@@ -793,60 +793,60 @@ const CustomizableWidgets = [
         let btnNode = aDocument.createElementNS(kNSXUL, "toolbarbutton");
         setAttributes(btnNode, aButton);
         node.appendChild(btnNode);
       });
 
       updateCombinedWidgetStyle(node, this.currentArea);
 
       let listener = {
-        onWidgetAdded: function(aWidgetId, aArea, aPosition) {
+        onWidgetAdded: (aWidgetId, aArea, aPosition) => {
           if (aWidgetId != this.id)
             return;
           updateCombinedWidgetStyle(node, aArea);
-        }.bind(this),
+        },
 
-        onWidgetRemoved: function(aWidgetId, aPrevArea) {
+        onWidgetRemoved: (aWidgetId, aPrevArea) => {
           if (aWidgetId != this.id)
             return;
           // When a widget is demoted to the palette ('removed'), it's visual
           // style should change.
           updateCombinedWidgetStyle(node);
-        }.bind(this),
+        },
 
-        onWidgetReset: function(aWidgetNode) {
+        onWidgetReset: aWidgetNode => {
           if (aWidgetNode != node)
             return;
           updateCombinedWidgetStyle(node, this.currentArea);
-        }.bind(this),
+        },
 
-        onWidgetUndoMove: function(aWidgetNode) {
+        onWidgetUndoMove: aWidgetNode => {
           if (aWidgetNode != node)
             return;
           updateCombinedWidgetStyle(node, this.currentArea);
-        }.bind(this),
+        },
 
-        onWidgetMoved: function(aWidgetId, aArea) {
+        onWidgetMoved: (aWidgetId, aArea) => {
           if (aWidgetId != this.id)
             return;
           updateCombinedWidgetStyle(node, aArea);
-        }.bind(this),
+        },
 
-        onWidgetInstanceRemoved: function(aWidgetId, aDoc) {
+        onWidgetInstanceRemoved: (aWidgetId, aDoc) => {
           if (aWidgetId != this.id || aDoc != aDocument)
             return;
           CustomizableUI.removeListener(listener);
-        }.bind(this),
+        },
 
-        onWidgetDrag: function(aWidgetId, aArea) {
+        onWidgetDrag: (aWidgetId, aArea) => {
           if (aWidgetId != this.id)
             return;
           aArea = aArea || this.currentArea;
           updateCombinedWidgetStyle(node, aArea);
-        }.bind(this)
+        }
       };
       CustomizableUI.addListener(listener);
 
       return node;
     }
   },
   {
     id: "feed-button",
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -380,24 +380,24 @@ CustomizeMode.prototype = {
         this.document.getElementById("nav-bar").setAttribute("showoutline", "true");
         this.panelUIContents.setAttribute("showoutline", "true");
         delete this._enableOutlinesTimeout;
       }, 0);
 
       if (!this._wantToBeInCustomizeMode) {
         this.exit();
       }
-    }.bind(this)).then(null, function(e) {
+    }.bind(this)).then(null, e => {
       log.error("Error entering customize mode", e);
       // We should ensure this has been called, and calling it again doesn't hurt:
       window.PanelUI.endBatchUpdate();
       this._handler.isEnteringCustomizeMode = false;
       // Exit customize mode to ensure proper clean-up when entering failed.
       this.exit();
-    }.bind(this));
+    });
   },
 
   exit() {
     this._wantToBeInCustomizeMode = false;
 
     if (!this._customizing || this._handler.isExitingCustomizeMode) {
       return;
     }
@@ -537,22 +537,22 @@ CustomizeMode.prototype = {
       this._transitioning = false;
       this._handler.isExitingCustomizeMode = false;
       CustomizableUI.dispatchToolboxEvent("aftercustomization", {}, window);
       CustomizableUI.notifyEndCustomizing(window);
 
       if (this._wantToBeInCustomizeMode) {
         this.enter();
       }
-    }.bind(this)).then(null, function(e) {
+    }.bind(this)).then(null, e => {
       log.error("Error exiting customize mode", e);
       // We should ensure this has been called, and calling it again doesn't hurt:
       window.PanelUI.endBatchUpdate();
       this._handler.isExitingCustomizeMode = false;
-    }.bind(this));
+    });
   },
 
   /**
    * The customize mode transition has 4 phases when entering:
    * 1) Pre-customization mode
    *    This is the starting phase of the browser.
    * 2) LWT swapping
    *    This is where we swap some of the lightweight theme styles in order
@@ -1315,17 +1315,17 @@ CustomizeMode.prototype = {
     }
 
     let onThemeSelected = panel => {
       this._updateLWThemeButtonIcon();
       this._onUIChange();
       panel.hidePopup();
     };
 
-    AddonManager.getAddonByID(DEFAULT_THEME_ID, function(aDefaultTheme) {
+    AddonManager.getAddonByID(DEFAULT_THEME_ID, aDefaultTheme => {
       let doc = this.window.document;
 
       function buildToolbarButton(aTheme) {
         let tbb = doc.createElement("toolbarbutton");
         tbb.theme = aTheme;
         tbb.setAttribute("label", aTheme.name);
         if (aDefaultTheme == aTheme) {
           // The actual icon is set up so it looks nice in about:addons, but
@@ -1398,17 +1398,17 @@ CustomizeMode.prototype = {
           lwthemePrefs.setStringPref("recommendedThemes",
                                      JSON.stringify(recommendedThemes));
           onThemeSelected(panel);
         });
         panel.insertBefore(button, footer);
       }
       let hideRecommendedLabel = (footer.previousSibling == recommendedLabel);
       recommendedLabel.hidden = hideRecommendedLabel;
-    }.bind(this));
+    });
   },
 
   _clearLWThemesMenu(panel) {
     let footer = this.document.getElementById("customization-lwtheme-menu-footer");
     let recommendedLabel = this.document.getElementById("customization-lwtheme-menu-recommended");
     for (let element of [footer, recommendedLabel]) {
       while (element.previousSibling &&
              element.previousSibling.localName == "toolbarbutton") {
@@ -1558,17 +1558,17 @@ CustomizeMode.prototype = {
                       y: itemRect.top + itemRect.height / 2};
     this._dragOffset = {x: aEvent.clientX - itemCenter.x,
                         y: aEvent.clientY - itemCenter.y};
 
     gDraggingInToolbars = new Set();
 
     // Hack needed so that the dragimage will still show the
     // item as it appeared before it was hidden.
-    this._initializeDragAfterMove = function() {
+    this._initializeDragAfterMove = () => {
       // For automated tests, we sometimes start exiting customization mode
       // before this fires, which leaves us with placeholders inserted after
       // we've exited. So we need to check that we are indeed customizing.
       if (this._customizing && !this._transitioning) {
         item.hidden = true;
         this._showPanelCustomizationPlaceholders();
         DragPositionManager.start(this.window);
         if (item.nextSibling) {
@@ -1576,17 +1576,17 @@ CustomizeMode.prototype = {
           this._dragOverItem = item.nextSibling;
         } else if (isInToolbar && item.previousSibling) {
           this._setDragActive(item.previousSibling, "after", draggedItem.id, isInToolbar);
           this._dragOverItem = item.previousSibling;
         }
       }
       this._initializeDragAfterMove = null;
       this.window.clearTimeout(this._dragInitializeTimeout);
-    }.bind(this);
+    };
     this._dragInitializeTimeout = this.window.setTimeout(this._initializeDragAfterMove, 0);
   },
 
   _onDragOver(aEvent) {
     if (this._isUnwantedDragDrop(aEvent)) {
       return;
     }
     if (this._initializeDragAfterMove) {
--- a/browser/components/feeds/FeedWriter.js
+++ b/browser/components/feeds/FeedWriter.js
@@ -960,23 +960,23 @@ FeedWriter.prototype = {
       LOG(`FeedWriter:SetFeedPrefsAndSubscribe - ${JSON.stringify(settings)}`);
       this._mm.sendAsyncMessage("FeedWriter:SetFeedPrefsAndSubscribe",
                                 settings);
     }
 
     // Show the file picker before subscribing if the
     // choose application menuitem was chosen using the keyboard
     if (selectedItem.id == "chooseApplicationMenuItem") {
-      this._chooseClientApp(function(aResult) {
+      this._chooseClientApp(aResult => {
         if (aResult) {
           selectedItem =
             this._handlersList.selectedOptions[0];
           subscribeCallback();
         }
-      }.bind(this));
+      });
     } else {
       subscribeCallback();
     }
   },
 
   get _mm() {
     let mm = this._window.QueryInterface(Ci.nsIInterfaceRequestor).
                           getInterface(Ci.nsIDocShell).
--- a/browser/components/migration/FirefoxProfileMigrator.js
+++ b/browser/components/migration/FirefoxProfileMigrator.js
@@ -100,17 +100,17 @@ FirefoxProfileMigrator.prototype.getReso
 FirefoxProfileMigrator.prototype.getLastUsedDate = function() {
   // We always pretend we're really old, so that we don't mess
   // up the determination of which browser is the most 'recent'
   // to import from.
   return Promise.resolve(new Date(0));
 };
 
 FirefoxProfileMigrator.prototype._getResourcesInternal = function(sourceProfileDir, currentProfileDir) {
-  let getFileResource = function(aMigrationType, aFileNames) {
+  let getFileResource = (aMigrationType, aFileNames) => {
     let files = [];
     for (let fileName of aFileNames) {
       let file = this._getFileObject(sourceProfileDir, fileName);
       if (file)
         files.push(file);
     }
     if (!files.length) {
       return null;
@@ -119,17 +119,17 @@ FirefoxProfileMigrator.prototype._getRes
       type: aMigrationType,
       migrate(aCallback) {
         for (let file of files) {
           file.copyTo(currentProfileDir, "");
         }
         aCallback(true);
       }
     };
-  }.bind(this);
+  };
 
   let types = MigrationUtils.resourceTypes;
   let places = getFileResource(types.HISTORY, ["places.sqlite"]);
   let favicons = getFileResource(types.HISTORY, ["favicons.sqlite"]);
   let cookies = getFileResource(types.COOKIES, ["cookies.sqlite"]);
   let passwords = getFileResource(types.PASSWORDS,
     ["signons.sqlite", "logins.json", "key3.db",
      "signedInUser.json"]);
--- a/browser/components/migration/SafariProfileMigrator.js
+++ b/browser/components/migration/SafariProfileMigrator.js
@@ -199,17 +199,17 @@ History.prototype = {
       let date = new Date("1 January 2001, GMT");
       date.setMilliseconds(asDouble * 1000);
       return date * 1000;
     }
     return 0;
   },
 
   migrate: function H_migrate(aCallback) {
-    PropertyListUtils.read(this._file, function migrateHistory(aDict) {
+    PropertyListUtils.read(this._file, aDict => {
       try {
         if (!aDict)
           throw new Error("Could not read history property list");
         if (!aDict.has("WebHistoryDates"))
           throw new Error("Unexpected history-property list format");
 
         // Safari's History file contains only top-level urls.  It does not
         // distinguish between typed urls and linked urls.
@@ -242,17 +242,17 @@ History.prototype = {
           });
         } else {
           aCallback(false);
         }
       } catch (ex) {
         Cu.reportError(ex);
         aCallback(false);
       }
-    }.bind(this));
+    });
   }
 };
 
 /**
  * Safari's preferences property list is independently used for three purposes:
  * (a) importation of preferences
  * (b) importation of search strings
  * (c) retrieving the home page.
@@ -271,27 +271,27 @@ MainPreferencesPropertyList.prototype = 
     if ("_dict" in this) {
       aCallback(this._dict);
       return;
     }
 
     let alreadyReading = this._callbacks.length > 0;
     this._callbacks.push(aCallback);
     if (!alreadyReading) {
-      PropertyListUtils.read(this._file, function readPrefs(aDict) {
+      PropertyListUtils.read(this._file, aDict => {
         this._dict = aDict;
         for (let callback of this._callbacks) {
           try {
             callback(aDict);
           } catch (ex) {
             Cu.reportError(ex);
           }
         }
         this._callbacks.splice(0);
-      }.bind(this));
+      });
     }
   },
 
   // Workaround for nsIBrowserProfileMigrator.sourceHomePageURL until
   // it's replaced with an async method.
   _readSync: function MPPL__readSync() {
     if ("_dict" in this)
       return this._dict;
--- a/browser/components/places/content/places.js
+++ b/browser/components/places/content/places.js
@@ -477,21 +477,21 @@ var PlacesOrganizer = {
    * Called when 'Choose File...' is selected from the restore menu.
    * Prompts for a file and restores bookmarks to those in the file.
    */
   onRestoreBookmarksFromFile: function PO_onRestoreBookmarksFromFile() {
     let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
                  getService(Ci.nsIProperties);
     let backupsDir = dirSvc.get("Desk", Ci.nsILocalFile);
     let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
-    let fpCallback = function fpCallback_done(aResult) {
+    let fpCallback = aResult => {
       if (aResult != Ci.nsIFilePicker.returnCancel) {
         this.restoreBookmarksFromFile(fp.file.path);
       }
-    }.bind(this);
+    };
 
     fp.init(window, PlacesUIUtils.getString("bookmarksRestoreTitle"),
             Ci.nsIFilePicker.modeOpen);
     fp.appendFilter(PlacesUIUtils.getString("bookmarksRestoreFilterName"),
                     RESTORE_FILEPICKER_FILTER_EXT);
     fp.appendFilters(Ci.nsIFilePicker.filterAll);
     fp.displayDirectory = backupsDir;
     fp.open(fpCallback);
--- a/browser/components/preferences/in-content-old/advanced.js
+++ b/browser/components/preferences/in-content-old/advanced.js
@@ -29,20 +29,20 @@ var gAdvancedPane = {
     this._inited = true;
     var advancedPrefs = document.getElementById("advancedPrefs");
 
     var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex");
     if (preference.value !== null)
         advancedPrefs.selectedIndex = preference.value;
 
     if (AppConstants.MOZ_UPDATER) {
-      let onUnload = function() {
+      let onUnload = () => {
         window.removeEventListener("unload", onUnload);
         Services.prefs.removeObserver("app.update.", this);
-      }.bind(this);
+      };
       window.addEventListener("unload", onUnload);
       Services.prefs.addObserver("app.update.", this);
       this.updateReadPrefs();
     }
     if (AppConstants.MOZ_CRASHREPORTER) {
       this.initSubmitCrashes();
     }
     this.initTelemetry();
--- a/browser/components/preferences/in-content-old/applications.js
+++ b/browser/components/preferences/in-content-old/applications.js
@@ -1688,17 +1688,17 @@ var gApplicationsPane = {
   },
 
   chooseApp(aEvent) {
     // Don't let the normal "on select action" handler get this event,
     // as we handle it specially ourselves.
     aEvent.stopPropagation();
 
     var handlerApp;
-    let chooseAppCallback = function(aHandlerApp) {
+    let chooseAppCallback = aHandlerApp => {
       // Rebuild the actions menu whether the user picked an app or canceled.
       // If they picked an app, we want to add the app to the menu and select it.
       // If they canceled, we want to go back to their previous selection.
       this.rebuildActionsMenu();
 
       // If the user picked a new app from the menu, select it.
       if (aHandlerApp) {
         let typeItem = this._list.selectedItem;
@@ -1709,17 +1709,17 @@ var gApplicationsPane = {
           let menuItem = menuItems[i];
           if (menuItem.handlerApp && menuItem.handlerApp.equals(aHandlerApp)) {
             actionsMenu.selectedIndex = i;
             this.onSelectAction(menuItem);
             break;
           }
         }
       }
-    }.bind(this);
+    };
 
     if (AppConstants.platform == "win") {
       var params = {};
       var handlerInfo = this._handledTypes[this._list.selectedItem.type];
 
       if (isFeedType(handlerInfo.type)) {
         // MIME info will be null, create a temp object.
         params.mimeInfo = this._mimeSvc.getFromTypeAndExtension(handlerInfo.type,
@@ -1744,31 +1744,31 @@ var gApplicationsPane = {
         chooseAppCallback(handlerApp);
       };
 
       gSubDialog.open("chrome://global/content/appPicker.xul",
                       null, params, onAppSelected);
     } else {
       let winTitle = this._prefsBundle.getString("fpTitleChooseApp");
       let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
-      let fpCallback = function fpCallback_done(aResult) {
+      let fpCallback = aResult => {
         if (aResult == Ci.nsIFilePicker.returnOK && fp.file &&
             this._isValidHandlerExecutable(fp.file)) {
           handlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
                        createInstance(Ci.nsILocalHandlerApp);
           handlerApp.name = getFileDisplayName(fp.file);
           handlerApp.executable = fp.file;
 
           // Add the app to the type's list of possible handlers.
           let handler = this._handledTypes[this._list.selectedItem.type];
           handler.addPossibleApplicationHandler(handlerApp);
 
           chooseAppCallback(handlerApp);
         }
-      }.bind(this);
+      };
 
       // Prompt the user to pick an app.  If they pick one, and it's a valid
       // selection, then add it to the list of possible handlers.
       fp.init(window, winTitle, Ci.nsIFilePicker.modeOpen);
       fp.appendFilters(Ci.nsIFilePicker.filterApps);
       fp.open(fpCallback);
     }
   },
--- a/browser/components/preferences/in-content-old/sync.js
+++ b/browser/components/preferences/in-content-old/sync.js
@@ -56,21 +56,21 @@ var gSyncPane = {
 
     let onUnload = function() {
       window.removeEventListener("unload", onUnload);
       try {
         Services.obs.removeObserver(onReady, "weave:service:ready");
       } catch (e) {}
     };
 
-    let onReady = function() {
+    let onReady = () => {
       Services.obs.removeObserver(onReady, "weave:service:ready");
       window.removeEventListener("unload", onUnload);
       this._init();
-    }.bind(this);
+    };
 
     Services.obs.addObserver(onReady, "weave:service:ready");
     window.addEventListener("unload", onUnload);
 
     xps.ensureLoaded();
   },
 
   _showLoadPage(xps) {
--- a/browser/components/preferences/in-content/advanced.js
+++ b/browser/components/preferences/in-content/advanced.js
@@ -16,20 +16,20 @@ var gAdvancedPane = {
     function setEventListener(aId, aEventType, aCallback) {
       document.getElementById(aId)
               .addEventListener(aEventType, aCallback.bind(gAdvancedPane));
     }
 
     this._inited = true;
 
     if (AppConstants.MOZ_UPDATER) {
-      let onUnload = function() {
+      let onUnload = () => {
         window.removeEventListener("unload", onUnload);
         Services.prefs.removeObserver("app.update.", this);
-      }.bind(this);
+      };
       window.addEventListener("unload", onUnload);
       Services.prefs.addObserver("app.update.", this);
       this.updateReadPrefs();
       setEventListener("updateRadioGroup", "command",
                        gAdvancedPane.updateWritePrefs);
       setEventListener("showUpdateHistory", "command",
                        gAdvancedPane.showUpdates);
     }
--- a/browser/components/preferences/in-content/applications.js
+++ b/browser/components/preferences/in-content/applications.js
@@ -1692,17 +1692,17 @@ var gApplicationsPane = {
   },
 
   chooseApp(aEvent) {
     // Don't let the normal "on select action" handler get this event,
     // as we handle it specially ourselves.
     aEvent.stopPropagation();
 
     var handlerApp;
-    let chooseAppCallback = function(aHandlerApp) {
+    let chooseAppCallback = aHandlerApp => {
       // Rebuild the actions menu whether the user picked an app or canceled.
       // If they picked an app, we want to add the app to the menu and select it.
       // If they canceled, we want to go back to their previous selection.
       this.rebuildActionsMenu();
 
       // If the user picked a new app from the menu, select it.
       if (aHandlerApp) {
         let typeItem = this._list.selectedItem;
@@ -1713,17 +1713,17 @@ var gApplicationsPane = {
           let menuItem = menuItems[i];
           if (menuItem.handlerApp && menuItem.handlerApp.equals(aHandlerApp)) {
             actionsMenu.selectedIndex = i;
             this.onSelectAction(menuItem);
             break;
           }
         }
       }
-    }.bind(this);
+    };
 
     if (AppConstants.platform == "win") {
       var params = {};
       var handlerInfo = this._handledTypes[this._list.selectedItem.type];
 
       if (isFeedType(handlerInfo.type)) {
         // MIME info will be null, create a temp object.
         params.mimeInfo = this._mimeSvc.getFromTypeAndExtension(handlerInfo.type,
@@ -1748,31 +1748,31 @@ var gApplicationsPane = {
         chooseAppCallback(handlerApp);
       };
 
       gSubDialog.open("chrome://global/content/appPicker.xul",
                       null, params, onAppSelected);
     } else {
       let winTitle = this._prefsBundle.getString("fpTitleChooseApp");
       let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
-      let fpCallback = function fpCallback_done(aResult) {
+      let fpCallback = aResult => {
         if (aResult == Ci.nsIFilePicker.returnOK && fp.file &&
             this._isValidHandlerExecutable(fp.file)) {
           handlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
                        createInstance(Ci.nsILocalHandlerApp);
           handlerApp.name = getFileDisplayName(fp.file);
           handlerApp.executable = fp.file;
 
           // Add the app to the type's list of possible handlers.
           let handler = this._handledTypes[this._list.selectedItem.type];
           handler.addPossibleApplicationHandler(handlerApp);
 
           chooseAppCallback(handlerApp);
         }
-      }.bind(this);
+      };
 
       // Prompt the user to pick an app.  If they pick one, and it's a valid
       // selection, then add it to the list of possible handlers.
       fp.init(window, winTitle, Ci.nsIFilePicker.modeOpen);
       fp.appendFilters(Ci.nsIFilePicker.filterApps);
       fp.open(fpCallback);
     }
   },
--- a/browser/components/preferences/in-content/sync.js
+++ b/browser/components/preferences/in-content/sync.js
@@ -56,21 +56,21 @@ var gSyncPane = {
 
     let onUnload = function() {
       window.removeEventListener("unload", onUnload);
       try {
         Services.obs.removeObserver(onReady, "weave:service:ready");
       } catch (e) {}
     };
 
-    let onReady = function() {
+    let onReady = () => {
       Services.obs.removeObserver(onReady, "weave:service:ready");
       window.removeEventListener("unload", onUnload);
       this._init();
-    }.bind(this);
+    };
 
     Services.obs.addObserver(onReady, "weave:service:ready");
     window.addEventListener("unload", onUnload);
 
     xps.ensureLoaded();
   },
 
   _showLoadPage(xps) {
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -72,29 +72,29 @@
       <constructor><![CDATA[
         if (this.parentNode.parentNode.localName == "toolbarpaletteitem")
           return;
 
         Services.obs.addObserver(this, "browser-search-engine-modified");
 
         this._initialized = true;
 
-        Services.search.init((function search_init_cb(aStatus) {
+        Services.search.init(aStatus => {
           // Bail out if the binding's been destroyed
           if (!this._initialized)
             return;
 
           if (Components.isSuccessCode(aStatus)) {
             // Refresh the display (updating icon, etc)
             this.updateDisplay();
             BrowserSearch.updateOpenSearchBadge();
           } else {
             Components.utils.reportError("Cannot initialize search service, bailing out: " + aStatus);
           }
-        }).bind(this));
+        });
 
         // Some accessibility tests create their own <searchbar> that doesn't
         // use the popup binding below, so null-check oneOffButtons.
         if (this.textbox.popup.oneOffButtons) {
           this.textbox.popup.oneOffButtons.telemetryOrigin = "searchbar";
           this.textbox.popup.oneOffButtons.popup = this.textbox.popup;
           this.textbox.popup.oneOffButtons.textbox = this.textbox;
         }
--- a/browser/components/translation/BingTranslator.jsm
+++ b/browser/components/translation/BingTranslator.jsm
@@ -316,19 +316,19 @@ BingRequest.prototype = {
 
       requestString += "</Texts>" +
           "<To>" + this.targetLanguage + "</To>" +
         "</TranslateArrayRequest>";
 
       // Set up request options.
       let deferred = Promise.defer();
       let options = {
-        onLoad: (function(responseText, xhr) {
+        onLoad: (responseText, xhr) => {
           deferred.resolve(this);
-        }).bind(this),
+        },
         onError(e, responseText, xhr) {
           deferred.reject(xhr);
         },
         postData: requestString,
         headers
       };
 
       // Fire the request.
--- a/browser/components/translation/YandexTranslator.jsm
+++ b/browser/components/translation/YandexTranslator.jsm
@@ -309,19 +309,19 @@ YandexRequest.prototype = {
       for (let [, text] of this.translationData) {
         params.push(["text", text]);
         this.characterCount += text.length;
       }
 
       // Set up request options.
       let deferred = Promise.defer();
       let options = {
-        onLoad: (function(responseText, xhr) {
+        onLoad: (responseText, xhr) => {
           deferred.resolve(this);
-        }).bind(this),
+        },
         onError(e, responseText, xhr) {
           deferred.reject(xhr);
         },
         postData: params
       };
 
       // Fire the request.
       this.networkRequest = httpRequest(url, options);
--- a/browser/extensions/activity-stream/lib/Store.jsm
+++ b/browser/extensions/activity-stream/lib/Store.jsm
@@ -26,19 +26,19 @@ this.Store = class Store {
    * constructor - The redux store and message manager are created here,
    *               but no listeners are added until "init" is called.
    */
   constructor() {
     this._middleware = this._middleware.bind(this);
     // Bind each redux method so we can call it directly from the Store. E.g.,
     // store.dispatch() will call store._store.dispatch();
     ["dispatch", "getState", "subscribe"].forEach(method => {
-      this[method] = function(...args) {
+      this[method] = (...args) => {
         return this._store[method](...args);
-      }.bind(this);
+      };
     });
     this.feeds = new Map();
     this._feedFactories = null;
     this._prefHandlers = new Map();
     this._messageChannel = new ActivityStreamMessageChannel({dispatch: this.dispatch});
     this._store = redux.createStore(
       redux.combineReducers(reducers),
       redux.applyMiddleware(this._middleware, this._messageChannel.middleware)
--- a/browser/extensions/pdfjs/content/PdfStreamConverter.jsm
+++ b/browser/extensions/pdfjs/content/PdfStreamConverter.jsm
@@ -789,20 +789,20 @@ class FindEventManager {
     this.contentWindow = contentWindow;
     this.winmm = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
                               .getInterface(Ci.nsIDocShell)
                               .QueryInterface(Ci.nsIInterfaceRequestor)
                               .getInterface(Ci.nsIContentFrameMessageManager);
   }
 
   bind() {
-    var unload = function(e) {
+    var unload = e => {
       this.unbind();
       this.contentWindow.removeEventListener(e.type, unload);
-    }.bind(this);
+    };
     this.contentWindow.addEventListener("unload", unload);
 
     // We cannot directly attach listeners to for the find events
     // since the FindBar is in the parent process. Instead we're
     // asking the PdfjsChromeUtils to do it for us and forward
     // all the find events to us.
     this.winmm.sendAsyncMessage("PDFJS:Parent:addEventListener");
     this.winmm.addMessageListener("PDFJS:Child:handleEvent", this);
--- a/browser/extensions/pdfjs/content/build/pdf.js
+++ b/browser/extensions/pdfjs/content/build/pdf.js
@@ -987,17 +987,17 @@ var createObjectURL = function createObj
 function MessageHandler(sourceName, targetName, comObj) {
   this.sourceName = sourceName;
   this.targetName = targetName;
   this.comObj = comObj;
   this.callbackIndex = 1;
   this.postMessageTransfers = true;
   var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);
   var ah = this.actionHandler = Object.create(null);
-  this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) {
+  this._onComObjOnMessage = event => {
     var data = event.data;
     if (data.targetName !== this.sourceName) {
       return;
     }
     if (data.isReply) {
       var callbackId = data.callbackId;
       if (data.callbackId in callbacksCapabilities) {
         var callback = callbacksCapabilities[callbackId];
@@ -1038,17 +1038,17 @@ function MessageHandler(sourceName, targ
           });
         });
       } else {
         action[0].call(action[1], data.data);
       }
     } else {
       error('Unknown action from worker: ' + data.action);
     }
-  }.bind(this);
+  };
   comObj.addEventListener('message', this._onComObjOnMessage);
 }
 MessageHandler.prototype = {
   on: function messageHandlerOn(actionName, handler, scope) {
     var ah = this.actionHandler;
     if (ah[actionName]) {
       error('There is already an actionName called "' + actionName + '"');
     }
@@ -1220,24 +1220,24 @@ var DOMCMapReaderFactory = function DOMC
     this.isCompressed = params.isCompressed || false;
   }
   DOMCMapReaderFactory.prototype = {
     fetch: function (params) {
       var name = params.name;
       if (!name) {
         return Promise.reject(new Error('CMap name must be specified.'));
       }
-      return new Promise(function (resolve, reject) {
+      return new Promise((resolve, reject) => {
         var url = this.baseUrl + name + (this.isCompressed ? '.bcmap' : '');
         var request = new XMLHttpRequest();
         request.open('GET', url, true);
         if (this.isCompressed) {
           request.responseType = 'arraybuffer';
         }
-        request.onreadystatechange = function () {
+        request.onreadystatechange = () => {
           if (request.readyState !== XMLHttpRequest.DONE) {
             return;
           }
           if (request.status === 200 || request.status === 0) {
             var data;
             if (this.isCompressed && request.response) {
               data = new Uint8Array(request.response);
             } else if (!this.isCompressed && request.responseText) {
@@ -1247,19 +1247,19 @@ var DOMCMapReaderFactory = function DOMC
               resolve({
                 cMapData: data,
                 compressionType: this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE
               });
               return;
             }
           }
           reject(new Error('Unable to load ' + (this.isCompressed ? 'binary ' : '') + 'CMap at: ' + url));
-        }.bind(this);
+        };
         request.send(null);
-      }.bind(this));
+      });
     }
   };
   return DOMCMapReaderFactory;
 }();
 var CustomStyle = function CustomStyleClosure() {
   var prefixes = ['ms', 'Moz', 'Webkit', 'O'];
   var _cache = Object.create(null);
   function CustomStyle() {}
@@ -2234,23 +2234,23 @@ var PDFDocumentLoadingTask = function PD
   }
   PDFDocumentLoadingTask.prototype = {
     get promise() {
       return this._capability.promise;
     },
     destroy: function () {
       this.destroyed = true;
       var transportDestroyed = !this._transport ? Promise.resolve() : this._transport.destroy();
-      return transportDestroyed.then(function () {
+      return transportDestroyed.then(() => {
         this._transport = null;
         if (this._worker) {
           this._worker.destroy();
           this._worker = null;
         }
-      }.bind(this));
+      });
     },
     then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {
       return this.promise.then.apply(this.promise, arguments);
     }
   };
   return PDFDocumentLoadingTask;
 }();
 var PDFDataRangeTransport = function pdfDataRangeTransportClosure() {
@@ -2274,30 +2274,30 @@ var PDFDataRangeTransport = function pdf
     },
     onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {
       var listeners = this._rangeListeners;
       for (var i = 0, n = listeners.length; i < n; ++i) {
         listeners[i](begin, chunk);
       }
     },
     onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {
-      this._readyCapability.promise.then(function () {
+      this._readyCapability.promise.then(() => {
         var listeners = this._progressListeners;
         for (var i = 0, n = listeners.length; i < n; ++i) {
           listeners[i](loaded);
         }
-      }.bind(this));
+      });
     },
     onDataProgressiveRead: function PDFDataRangeTransport_onDataProgress(chunk) {
-      this._readyCapability.promise.then(function () {
+      this._readyCapability.promise.then(() => {
         var listeners = this._progressiveReadListeners;
         for (var i = 0, n = listeners.length; i < n; ++i) {
           listeners[i](chunk);
         }
-      }.bind(this));
+      });
     },
     transportReady: function PDFDataRangeTransport_transportReady() {
       this._readyCapability.resolve();
     },
     requestDataRange: function PDFDataRangeTransport_requestDataRange(begin, end) {
       throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');
     },
     abort: function PDFDataRangeTransport_abort() {}
@@ -2655,21 +2655,21 @@ var PDFWorker = function PDFWorkerClosur
       if (!this._defer) {
         this._listeners.forEach(function (listener) {
           listener.call(this, { data: obj });
         }, this);
         return;
       }
       var cloned = new WeakMap();
       var e = { data: cloneValue(obj) };
-      this._deferred.then(function () {
+      this._deferred.then(() => {
         this._listeners.forEach(function (listener) {
           listener.call(this, e);
         }, this);
-      }.bind(this));
+      });
     },
     addEventListener: function (name, listener) {
       this._listeners.push(listener);
     },
     removeEventListener: function (name, listener) {
       var i = this._listeners.indexOf(listener);
       this._listeners.splice(i, 1);
     },
@@ -2711,33 +2711,33 @@ var PDFWorker = function PDFWorkerClosur
       this._readyCapability.resolve();
     },
     _initialize: function PDFWorker_initialize() {
       if (!isWorkerDisabled && !(0, _dom_utils.getDefaultSetting)('disableWorker') && typeof Worker !== 'undefined') {
         var workerSrc = getWorkerSrc();
         try {
           var worker = new Worker(workerSrc);
           var messageHandler = new _util.MessageHandler('main', 'worker', worker);
-          var terminateEarly = function () {
+          var terminateEarly = () => {
             worker.removeEventListener('error', onWorkerError);
             messageHandler.destroy();
             worker.terminate();
             if (this.destroyed) {
               this._readyCapability.reject(new Error('Worker was destroyed'));
             } else {
               this._setupFakeWorker();
             }
-          }.bind(this);
-          var onWorkerError = function (event) {
+          };
+          var onWorkerError = event => {
             if (!this._webWorker) {
               terminateEarly();
             }
-          }.bind(this);
+          };
           worker.addEventListener('error', onWorkerError);
-          messageHandler.on('test', function PDFWorker_test(data) {
+          messageHandler.on('test', data => {
             worker.removeEventListener('error', onWorkerError);
             if (this.destroyed) {
               terminateEarly();
               return;
             }
             var supportTypedArray = data && data.supportTypedArray;
             if (supportTypedArray) {
               this._messageHandler = messageHandler;
@@ -2748,35 +2748,35 @@ var PDFWorker = function PDFWorkerClosur
               }
               this._readyCapability.resolve();
               messageHandler.send('configure', { verbosity: (0, _util.getVerbosityLevel)() });
             } else {
               this._setupFakeWorker();
               messageHandler.destroy();
               worker.terminate();
             }
-          }.bind(this));
+          });
           messageHandler.on('console_log', function (data) {
             console.log.apply(console, data);
           });
           messageHandler.on('console_error', function (data) {
             console.error.apply(console, data);
           });
-          messageHandler.on('ready', function (data) {
+          messageHandler.on('ready', data => {
             worker.removeEventListener('error', onWorkerError);
             if (this.destroyed) {
               terminateEarly();
               return;
             }
             try {
               sendTest();
             } catch (e) {
               this._setupFakeWorker();
             }
-          }.bind(this));
+          });
           var sendTest = function () {
             var postMessageTransfers = (0, _dom_utils.getDefaultSetting)('postMessageTransfers') && !isPostMessageTransfersDisabled;
             var testObj = new Uint8Array([postMessageTransfers ? 255 : 0]);
             try {
               messageHandler.send('test', testObj, [testObj.buffer]);
             } catch (ex) {
               (0, _util.info)('Cannot use postMessage transfers');
               testObj[0] = 0;
@@ -2791,31 +2791,31 @@ var PDFWorker = function PDFWorkerClosur
       }
       this._setupFakeWorker();
     },
     _setupFakeWorker: function PDFWorker_setupFakeWorker() {
       if (!isWorkerDisabled && !(0, _dom_utils.getDefaultSetting)('disableWorker')) {
         (0, _util.warn)('Setting up fake worker.');
         isWorkerDisabled = true;
       }
-      setupFakeWorkerGlobal().then(function (WorkerMessageHandler) {
+      setupFakeWorkerGlobal().then(WorkerMessageHandler => {
         if (this.destroyed) {
           this._readyCapability.reject(new Error('Worker was destroyed'));
           return;
         }
         var isTypedArraysPresent = Uint8Array !== Float32Array;
         var port = new FakeWorkerPort(isTypedArraysPresent);
         this._port = port;
         var id = 'fake' + nextFakeWorkerId++;
         var workerHandler = new _util.MessageHandler(id + '_worker', id, port);
         WorkerMessageHandler.setup(workerHandler, port);
         var messageHandler = new _util.MessageHandler(id, id + '_worker', port);
         this._messageHandler = messageHandler;
         this._readyCapability.resolve();
-      }.bind(this));
+      });
     },
     destroy: function PDFWorker_destroy() {
       this.destroyed = true;
       if (this._webWorker) {
         this._webWorker.terminate();
         this._webWorker = null;
       }
       this._port = null;
@@ -2908,19 +2908,19 @@ var WorkerTransport = function WorkerTra
         var loadingTask = this.loadingTask;
         var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);
         this.pdfDocument = pdfDocument;
         loadingTask._capability.resolve(pdfDocument);
       }, this);
       messageHandler.on('PasswordRequest', function transportPasswordRequest(exception) {
         this._passwordCapability = (0, _util.createPromiseCapability)();
         if (loadingTask.onPassword) {
-          var updatePassword = function (password) {
+          var updatePassword = password => {
             this._passwordCapability.resolve({ password: password });
-          }.bind(this);
+          };
           loadingTask.onPassword(updatePassword, exception.code);
         } else {
           this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));
         }
         return this._passwordCapability.promise;
       }, this);
       messageHandler.on('PasswordException', function transportPasswordException(exception) {
         loadingTask._capability.reject(new _util.PasswordException(exception.message, exception.code));
@@ -2986,19 +2986,19 @@ var WorkerTransport = function WorkerTra
                 }
               };
             }
             var font = new _font_loader.FontFaceObject(exportedData, {
               isEvalSuported: (0, _dom_utils.getDefaultSetting)('isEvalSupported'),
               disableFontFace: (0, _dom_utils.getDefaultSetting)('disableFontFace'),
               fontRegistry: fontRegistry
             });
-            this.fontLoader.bind([font], function fontReady(fontObjs) {
+            this.fontLoader.bind([font], fontObjs => {
               this.commonObjs.resolve(id, font);
-            }.bind(this));
+            });
             break;
           case 'FontPath':
             this.commonObjs.resolve(id, data[2]);
             break;
           default:
             (0, _util.error)('Got unknown common object type ' + type);
         }
       }, this);
@@ -3135,24 +3135,24 @@ var WorkerTransport = function WorkerTra
     getPage: function WorkerTransport_getPage(pageNumber, capability) {
       if (!(0, _util.isInt)(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) {
         return Promise.reject(new Error('Invalid page request'));
       }
       var pageIndex = pageNumber - 1;
       if (pageIndex in this.pagePromises) {
         return this.pagePromises[pageIndex];
       }
-      var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(function (pageInfo) {
+      var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(pageInfo => {
         if (this.destroyed) {
           throw new Error('Transport destroyed');
         }
         var page = new PDFPageProxy(pageIndex, pageInfo, this);
         this.pageCache[pageIndex] = page;
         return page;
-      }.bind(this));
+      });
       this.pagePromises[pageIndex] = promise;
       return promise;
     },
     getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {
       return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }).catch(function (reason) {
         return Promise.reject(new Error(reason));
       });
     },
@@ -3187,26 +3187,26 @@ var WorkerTransport = function WorkerTra
           metadata: results[1] ? new _metadata.Metadata(results[1]) : null
         };
       });
     },
     getStats: function WorkerTransport_getStats() {
       return this.messageHandler.sendWithPromise('GetStats', null);
     },
     startCleanup: function WorkerTransport_startCleanup() {
-      this.messageHandler.sendWithPromise('Cleanup', null).then(function endCleanup() {
+      this.messageHandler.sendWithPromise('Cleanup', null).then(() => {
         for (var i = 0, ii = this.pageCache.length; i < ii; i++) {
           var page = this.pageCache[i];
           if (page) {
             page.cleanup();
           }
         }
         this.commonObjs.clear();
         this.fontLoader.clear();
-      }.bind(this));
+      });
     }
   };
   return WorkerTransport;
 }();
 var PDFObjects = function PDFObjectsClosure() {
   function PDFObjects() {
     this.objs = Object.create(null);
   }
--- a/browser/extensions/pdfjs/content/build/pdf.worker.js
+++ b/browser/extensions/pdfjs/content/build/pdf.worker.js
@@ -987,17 +987,17 @@ var createObjectURL = function createObj
 function MessageHandler(sourceName, targetName, comObj) {
   this.sourceName = sourceName;
   this.targetName = targetName;
   this.comObj = comObj;
   this.callbackIndex = 1;
   this.postMessageTransfers = true;
   var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);
   var ah = this.actionHandler = Object.create(null);
-  this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) {
+  this._onComObjOnMessage = event => {
     var data = event.data;
     if (data.targetName !== this.sourceName) {
       return;
     }
     if (data.isReply) {
       var callbackId = data.callbackId;
       if (data.callbackId in callbacksCapabilities) {
         var callback = callbacksCapabilities[callbackId];
@@ -1038,17 +1038,17 @@ function MessageHandler(sourceName, targ
           });
         });
       } else {
         action[0].call(action[1], data.data);
       }
     } else {
       error('Unknown action from worker: ' + data.action);
     }
-  }.bind(this);
+  };
   comObj.addEventListener('message', this._onComObjOnMessage);
 }
 MessageHandler.prototype = {
   on: function messageHandlerOn(actionName, handler, scope) {
     var ah = this.actionHandler;
     if (ah[actionName]) {
       error('There is already an actionName called "' + actionName + '"');
     }
@@ -14551,25 +14551,25 @@ var ChunkedStreamManager = function Chun
             chunks = null;
             resolve(chunkData);
           } catch (e) {
             reject(e);
           }
         };
         rangeReader.read().then(readChunk, reject);
       });
-      promise.then(function (data) {
+      promise.then(data => {
         if (this.aborted) {
           return;
         }
         this.onReceiveData({
           chunk: data,
           begin: begin
         });
-      }.bind(this));
+      });
     },
     requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
       var missingChunks = this.stream.getMissingChunks();
       this._requestChunks(missingChunks);
       return this._loadedStreamCapability.promise;
     },
     _requestChunks: function ChunkedStreamManager_requestChunks(chunks) {
       var requestId = this.currRequestId++;
@@ -16793,22 +16793,22 @@ var PartialEvaluator = function PartialE
         return translated.loadedName;
       });
     },
     handleText: function PartialEvaluator_handleText(chars, state) {
       var font = state.font;
       var glyphs = font.charsToGlyphs(chars);
       var isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG);
       if (font.data && (isAddToPathSet || this.options.disableFontFace)) {
-        var buildPath = function (fontChar) {
+        var buildPath = fontChar => {
           if (!font.renderer.hasBuiltPath(fontChar)) {
             var path = font.renderer.getPathJs(fontChar);
             this.handler.send('commonobj', [font.loadedName + '_path_' + fontChar, 'FontPath', path]);
           }
-        }.bind(this);
+        };
         for (var i = 0, ii = glyphs.length; i < ii; i++) {
           var glyph = glyphs[i];
           buildPath(glyph.fontChar);
           var accent = glyph.accent;
           if (accent && accent.fontChar) {
             buildPath(accent.fontChar);
           }
         }
@@ -17269,25 +17269,25 @@ var PartialEvaluator = function PartialE
           operatorList.addOp(fn, args);
         }
         if (stop) {
           next(deferred);
           return;
         }
         closePendingRestoreOPS();
         resolve();
-      }).catch(function (reason) {
+      }).catch(reason => {
         if (this.options.ignoreErrors) {
           this.handler.send('UnsupportedFeature', { featureId: UNSUPPORTED_FEATURES.unknown });
           warn('getOperatorList - ignoring errors during task: ' + task.name);
           closePendingRestoreOPS();
           return;
         }
         throw reason;
-      }.bind(this));
+      });
     },
     getTextContent: function PartialEvaluator_getTextContent(stream, task, resources, stateManager, normalizeWhitespace, combineTextItems) {
       stateManager = stateManager || new StateManager(new TextState());
       var WhitespaceRegexp = /\s/g;
       var textContent = {
         items: [],
         styles: Object.create(null)
       };
@@ -17690,24 +17690,24 @@ var PartialEvaluator = function PartialE
           }
         }
         if (stop) {
           next(deferred);
           return;
         }
         flushTextContentItem();
         resolve(textContent);
-      }).catch(function (reason) {
+      }).catch(reason => {
         if (this.options.ignoreErrors) {
           warn('getTextContent - ignoring errors during task: ' + task.name);
           flushTextContentItem();
           return textContent;
         }
         throw reason;
-      }.bind(this));
+      });
     },
     extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, properties) {
       var xref = this.xref;
       var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');
       var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined);
       if (properties.composite) {
         var cidSystemInfo = dict.get('CIDSystemInfo');
         if (isDict(cidSystemInfo)) {
@@ -17773,20 +17773,20 @@ var PartialEvaluator = function PartialE
           }
         }
         properties.defaultEncoding = encoding;
       }
       properties.differences = differences;
       properties.baseEncodingName = baseEncodingName;
       properties.hasEncoding = !!baseEncodingName || differences.length > 0;
       properties.dict = dict;
-      return toUnicodePromise.then(function (toUnicode) {
+      return toUnicodePromise.then(toUnicode => {
         properties.toUnicode = toUnicode;
         return this.buildToUnicode(properties);
-      }.bind(this)).then(function (toUnicode) {
+      }).then(function (toUnicode) {
         properties.toUnicode = toUnicode;
         return properties;
       });
     },
     buildToUnicode: function PartialEvaluator_buildToUnicode(properties) {
       properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0;
       if (properties.hasIncludedToUnicodeMap) {
         return Promise.resolve(properties.toUnicode);
@@ -18156,20 +18156,20 @@ var PartialEvaluator = function PartialE
             type: type,
             name: baseFontName,
             widths: metrics.widths,
             defaultWidth: metrics.defaultWidth,
             flags: flags,
             firstChar: 0,
             lastChar: maxCharIndex
           };
-          return this.extractDataStructures(dict, dict, properties).then(function (properties) {
+          return this.extractDataStructures(dict, dict, properties).then(properties => {
             properties.widths = this.buildCharCodeToWidth(metrics.widths, properties);
             return new Font(baseFontName, null, properties);
-          }.bind(this));
+          });
         }
       }
       var firstChar = dict.get('FirstChar') || 0;
       var lastChar = dict.get('LastChar') || maxCharIndex;
       var fontName = descriptor.get('FontName');
       var baseFont = dict.get('BaseFont');
       if (isString(fontName)) {
         fontName = Name.get(fontName);
@@ -18237,25 +18237,25 @@ var PartialEvaluator = function PartialE
           useCMap: null
         }).then(function (cMap) {
           properties.cMap = cMap;
           properties.vertical = properties.cMap.vertical;
         });
       } else {
         cMapPromise = Promise.resolve(undefined);
       }
-      return cMapPromise.then(function () {
+      return cMapPromise.then(() => {
         return this.extractDataStructures(dict, baseDict, properties);
-      }.bind(this)).then(function (properties) {
+      }).then(properties => {
         this.extractWidths(dict, descriptor, properties);
         if (type === 'Type3') {
           properties.isType3Font = true;
         }
         return new Font(fontName.name, fontFile, properties);
-      }.bind(this));
+      });
     }
   };
   return PartialEvaluator;
 }();
 var TranslatedFont = function TranslatedFontClosure() {
   function TranslatedFont(loadedName, font, dict) {
     this.loadedName = loadedName;
     this.font = font;
@@ -21600,32 +21600,32 @@ var Catalog = function CatalogClosure() 
       return shadow(this, 'javaScript', javaScript);
     },
     cleanup: function Catalog_cleanup() {
       this.pageKidsCountCache.clear();
       var promises = [];
       this.fontCache.forEach(function (promise) {
         promises.push(promise);
       });
-      return Promise.all(promises).then(function (translatedFonts) {
+      return Promise.all(promises).then(translatedFonts => {
         for (var i = 0, ii = translatedFonts.length; i < ii; i++) {
           var font = translatedFonts[i].dict;
           delete font.translated;
         }
         this.fontCache.clear();
         this.builtInCMapCache = Object.create(null);
-      }.bind(this));
+      });
     },
     getPage: function Catalog_getPage(pageIndex) {
       if (!(pageIndex in this.pagePromises)) {
-        this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(function (a) {
+        this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(a => {
           var dict = a[0];
           var ref = a[1];
           return this.pageFactory.createPage(pageIndex, dict, ref, this.fontCache, this.builtInCMapCache);
-        }.bind(this));
+        });
       }
       return this.pagePromises[pageIndex];
     },
     getPageDict: function Catalog_getPageDict(pageIndex) {
       var capability = createPromiseCapability();
       var nodesToVisit = [this.catDict.getRaw('Pages')];
       var count,
           currentPageIndex = 0;
@@ -22660,26 +22660,26 @@ var ObjectLoader = function () {
           }
           if (foundMissingData) {
             nodesToRevisit.push(currentNode);
           }
         }
         addChildren(currentNode, nodesToVisit);
       }
       if (pendingRequests.length) {
-        this.xref.stream.manager.requestRanges(pendingRequests).then(function pendingRequestCallback() {
+        this.xref.stream.manager.requestRanges(pendingRequests).then(() => {
           nodesToVisit = nodesToRevisit;
           for (var i = 0; i < nodesToRevisit.length; i++) {
             var node = nodesToRevisit[i];
             if (isRef(node)) {
               this.refSet.remove(node);
             }
           }
           this._walk(nodesToVisit);
-        }.bind(this), this.capability.reject);
+        }, this.capability.reject);
         return;
       }
       this.refSet = null;
       this.capability.resolve();
     }
   };
   return ObjectLoader;
 }();
@@ -24266,28 +24266,28 @@ var Annotation = function AnnotationClos
       if (!dict.has('C')) {
         this.data.color = null;
       }
       this.data.hasPopup = dict.has('Popup');
       this.data.title = stringToPDFString(dict.get('T') || '');
       this.data.contents = stringToPDFString(dict.get('Contents') || '');
     },
     loadResources: function Annotation_loadResources(keys) {
-      return new Promise(function (resolve, reject) {
+      return new Promise((resolve, reject) => {
         this.appearance.dict.getAsync('Resources').then(function (resources) {
           if (!resources) {
             resolve();
             return;
           }
           var objectLoader = new ObjectLoader(resources.map, keys, resources.xref);
           objectLoader.load().then(function () {
             resolve(resources);
           }, reject);
         }, reject);
-      }.bind(this));
+      });
     },
     getOperatorList: function Annotation_getOperatorList(evaluator, task, renderForms) {
       if (!this.appearance) {
         return Promise.resolve(new OperatorList());
       }
       var data = this.data;
       var appearanceDict = this.appearance.dict;
       var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);
@@ -25806,20 +25806,20 @@ var Page = function PageClosure() {
         stream = new NullStream();
       }
       return stream;
     },
     loadResources: function Page_loadResources(keys) {
       if (!this.resourcesPromise) {
         this.resourcesPromise = this.pdfManager.ensure(this, 'resources');
       }
-      return this.resourcesPromise.then(function resourceSuccess() {
+      return this.resourcesPromise.then(() => {
         var objectLoader = new ObjectLoader(this.resources.map, keys, this.xref);
         return objectLoader.load();
-      }.bind(this));
+      });
     },
     getOperatorList: function Page_getOperatorList(handler, task, intent, renderInteractiveForms) {
       var self = this;
       var pdfManager = this.pdfManager;
       var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', []);
       var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);
       var partialEvaluator = new PartialEvaluator(pdfManager, this.xref, handler, this.pageIndex, this.idFactory, this.fontCache, this.builtInCMapCache, this.evaluatorOptions);
       var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
@@ -27290,26 +27290,26 @@ var Font = function FontClosure() {
         if (/Wingdings/i.test(name)) {
           warn('Non-embedded Wingdings font, falling back to ZapfDingbats.');
         }
         this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), properties.differences);
       } else if (isStandardFont) {
         this.toFontChar = buildToFontChar(properties.defaultEncoding, getGlyphsUnicode(), properties.differences);
       } else {
         glyphsUnicodeMap = getGlyphsUnicode();
-        this.toUnicode.forEach(function (charCode, unicodeCharCode) {
+        this.toUnicode.forEach((charCode, unicodeCharCode) => {
           if (!this.composite) {
             glyphName = properties.differences[charCode] || properties.defaultEncoding[charCode];
             unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
             if (unicode !== -1) {
               unicodeCharCode = unicode;
             }
           }
           this.toFontChar[charCode] = unicodeCharCode;
-        }.bind(this));
+        });
       }
       this.loadedName = fontName.split('-')[0];
       this.loading = false;
       this.fontType = getFontType(type, subtype);
       return;
     }
     if (subtype === 'Type1C') {
       if (type !== 'Type1' && type !== 'MMType1') {
--- a/browser/extensions/pdfjs/content/web/debugger.js
+++ b/browser/extensions/pdfjs/content/web/debugger.js
@@ -144,21 +144,21 @@ var FontInspector = (function FontInspec
       font.appendChild(document.createTextNode(' '));
       font.appendChild(download);
       font.appendChild(document.createTextNode(' '));
       font.appendChild(logIt);
       font.appendChild(moreInfo);
       fonts.appendChild(font);
       // Somewhat of a hack, should probably add a hook for when the text layer
       // is done rendering.
-      setTimeout(function() {
+      setTimeout(() => {
         if (this.active) {
           resetSelection();
         }
-      }.bind(this), 2000);
+      }, 2000);
     }
   };
 })();
 
 var opMap;
 
 // Manages all the page steppers.
 var StepperManager = (function StepperManagerClosure() {
--- a/browser/extensions/pdfjs/content/web/viewer.js
+++ b/browser/extensions/pdfjs/content/web/viewer.js
@@ -734,19 +734,19 @@ var PDFRenderingQueue = function PDFRend
           this.highestPriorityPage = view.renderingId;
           view.resume();
           break;
         case RenderingStates.RUNNING:
           this.highestPriorityPage = view.renderingId;
           break;
         case RenderingStates.INITIAL:
           this.highestPriorityPage = view.renderingId;
-          var continueRendering = function () {
+          var continueRendering = () => {
             this.renderHighestPriority();
-          }.bind(this);
+          };
           view.draw().then(continueRendering, continueRendering);
           break;
       }
       return true;
     }
   };
   return PDFRenderingQueue;
 }();
@@ -1182,20 +1182,20 @@ var PDFViewerApplication = {
     this.secondaryToolbar.reset();
     if (typeof PDFBug !== 'undefined') {
       PDFBug.cleanup();
     }
     return promise;
   },
   open: function pdfViewOpen(file, args) {
     if (this.pdfLoadingTask) {
-      return this.close().then(function () {
+      return this.close().then(() => {
         _preferences.Preferences.reload();
         return this.open(file, args);
-      }.bind(this));
+      });
     }
     var parameters = Object.create(null),
         scale;
     if (typeof file === 'string') {
       this.setTitleUsingUrl(file);
       parameters.url = file;
     } else if (file && 'byteLength' in file) {
       parameters.data = file;
@@ -1308,20 +1308,20 @@ var PDFViewerApplication = {
     if (percent > this.loadingBar.percent || isNaN(percent)) {
       this.loadingBar.percent = percent;
       if (_pdfjs.PDFJS.disableAutoFetch && percent) {
         if (this.disableAutoFetchLoadingBarTimeout) {
           clearTimeout(this.disableAutoFetchLoadingBarTimeout);
           this.disableAutoFetchLoadingBarTimeout = null;
         }
         this.loadingBar.show();
-        this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {
+        this.disableAutoFetchLoadingBarTimeout = setTimeout(() => {
           this.loadingBar.hide();
           this.disableAutoFetchLoadingBarTimeout = null;
-        }.bind(this), DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);
+        }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);
       }
     }
   },
   load: function pdfViewLoad(pdfDocument, scale) {
     var self = this;
     scale = scale || _ui_utils.UNKNOWN_SCALE;
     this.pdfDocument = pdfDocument;
     this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url);
@@ -2268,78 +2268,78 @@ exports.PDFPrintServiceFactory = PDFPrin
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 var OverlayManager = {
   overlays: {},
   active: null,
   register: function overlayManagerRegister(name, element, callerCloseMethod, canForceClose) {
-    return new Promise(function (resolve) {
+    return new Promise(resolve => {
       var container;
       if (!name || !element || !(container = element.parentNode)) {
         throw new Error('Not enough parameters.');
       } else if (this.overlays[name]) {
         throw new Error('The overlay is already registered.');
       }
       this.overlays[name] = {
         element: element,
         container: container,
         callerCloseMethod: callerCloseMethod || null,
         canForceClose: canForceClose || false
       };
       resolve();
-    }.bind(this));
+    });
   },
   unregister: function overlayManagerUnregister(name) {
-    return new Promise(function (resolve) {
+    return new Promise(resolve => {
       if (!this.overlays[name]) {
         throw new Error('The overlay does not exist.');
       } else if (this.active === name) {
         throw new Error('The overlay cannot be removed while it is active.');
       }
       delete this.overlays[name];
       resolve();
-    }.bind(this));
+    });
   },
   open: function overlayManagerOpen(name) {
-    return new Promise(function (resolve) {
+    return new Promise(resolve => {
       if (!this.overlays[name]) {
         throw new Error('The overlay does not exist.');
       } else if (this.active) {
         if (this.overlays[name].canForceClose) {
           this._closeThroughCaller();
         } else if (this.active === name) {
           throw new Error('The overlay is already active.');
         } else {
           throw new Error('Another overlay is currently active.');
         }
       }
       this.active = name;
       this.overlays[this.active].element.classList.remove('hidden');
       this.overlays[this.active].container.classList.remove('hidden');
       window.addEventListener('keydown', this._keyDown);
       resolve();
-    }.bind(this));
+    });
   },
   close: function overlayManagerClose(name) {
-    return new Promise(function (resolve) {
+    return new Promise(resolve => {
       if (!this.overlays[name]) {
         throw new Error('The overlay does not exist.');
       } else if (!this.active) {
         throw new Error('The overlay is currently not active.');
       } else if (this.active !== name) {
         throw new Error('Another overlay is currently active.');
       }
       this.overlays[this.active].container.classList.add('hidden');
       this.overlays[this.active].element.classList.add('hidden');
       this.active = null;
       window.removeEventListener('keydown', this._keyDown);
       resolve();
-    }.bind(this));
+    });
   },
   _keyDown: function overlayManager_keyDown(evt) {
     var self = OverlayManager;
     if (self.active && evt.keyCode === 27) {
       self._closeThroughCaller();
       evt.preventDefault();
     }
   },
@@ -2723,55 +2723,55 @@ function cloneObj(obj) {
   }
   return result;
 }
 var Preferences = {
   prefs: null,
   isInitializedPromiseResolved: false,
   initializedPromise: null,
   initialize: function preferencesInitialize() {
-    return this.initializedPromise = getDefaultPreferences().then(function (defaults) {
+    return this.initializedPromise = getDefaultPreferences().then(defaults => {
       Object.defineProperty(this, 'defaults', {
         value: Object.freeze(defaults),
         writable: false,
         enumerable: true,
         configurable: false
       });
       this.prefs = cloneObj(defaults);
       return this._readFromStorage(defaults);
-    }.bind(this)).then(function (prefObj) {
+    }).then(prefObj => {
       this.isInitializedPromiseResolved = true;
       if (prefObj) {
         this.prefs = prefObj;
       }
-    }.bind(this));
+    });
   },
   _writeToStorage: function preferences_writeToStorage(prefObj) {
     return Promise.resolve();
   },
   _readFromStorage: function preferences_readFromStorage(prefObj) {
     return Promise.resolve();
   },
   reset: function preferencesReset() {
-    return this.initializedPromise.then(function () {
+    return this.initializedPromise.then(() => {
       this.prefs = cloneObj(this.defaults);
       return this._writeToStorage(this.defaults);
-    }.bind(this));
+    });
   },
   reload: function preferencesReload() {
-    return this.initializedPromise.then(function () {
-      this._readFromStorage(this.defaults).then(function (prefObj) {
+    return this.initializedPromise.then(() => {
+      this._readFromStorage(this.defaults).then(prefObj => {
         if (prefObj) {
           this.prefs = prefObj;
         }
-      }.bind(this));
-    }.bind(this));
+      });
+    });
   },
   set: function preferencesSet(name, value) {
-    return this.initializedPromise.then(function () {
+    return this.initializedPromise.then(() => {
       if (this.defaults[name] === undefined) {
         throw new Error('preferencesSet: \'' + name + '\' is undefined.');
       } else if (value === undefined) {
         throw new Error('preferencesSet: no value is specified.');
       }
       var valueType = typeof value;
       var defaultType = typeof this.defaults[name];
       if (valueType !== defaultType) {
@@ -2782,31 +2782,31 @@ var Preferences = {
         }
       } else {
         if (valueType === 'number' && (value | 0) !== value) {
           throw new Error('Preferences_set: \'' + value + '\' must be an \"integer\".');
         }
       }
       this.prefs[name] = value;
       return this._writeToStorage(this.prefs);
-    }.bind(this));
+    });
   },
   get: function preferencesGet(name) {
-    return this.initializedPromise.then(function () {
+    return this.initializedPromise.then(() => {
       var defaultValue = this.defaults[name];
       if (defaultValue === undefined) {
         throw new Error('preferencesGet: \'' + name + '\' is undefined.');
       } else {
         var prefValue = this.prefs[name];
         if (prefValue !== undefined) {
           return prefValue;
         }
       }
       return defaultValue;
-    }.bind(this));
+    });
   }
 };
 ;
 exports.Preferences = Preferences;
 
 /***/ }),
 /* 8 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -3018,25 +3018,25 @@ var PDFFindController = function PDFFind
       extractPageText(0);
     },
     executeCommand: function PDFFindController_executeCommand(cmd, state) {
       if (this.state === null || cmd !== 'findagain') {
         this.dirtyMatch = true;
       }
       this.state = state;
       this.updateUIState(FindStates.FIND_PENDING);
-      this._firstPagePromise.then(function () {
+      this._firstPagePromise.then(() => {
         this.extractText();
         clearTimeout(this.findTimeout);
         if (cmd === 'find') {
           this.findTimeout = setTimeout(this.nextMatch.bind(this), 250);
         } else {
           this.nextMatch();
         }
-      }.bind(this));
+      });
     },
     updatePage: function PDFFindController_updatePage(index) {
       if (this.selected.pageIdx === index) {
         this.pdfViewer.currentPageNumber = index + 1;
       }
       var page = this.pdfViewer.getPageView(index);
       if (page.textLayer) {
         page.textLayer.updateMatches();
@@ -3340,22 +3340,22 @@ var DownloadManager = function DownloadM
       });
     },
     download: function DownloadManager_download(blob, url, filename) {
       var blobUrl = window.URL.createObjectURL(blob);
       FirefoxCom.request('download', {
         blobUrl: blobUrl,
         originalUrl: url,
         filename: filename
-      }, function response(err) {
+      }, err => {
         if (err && this.onerror) {
           this.onerror(err);
         }
         window.URL.revokeObjectURL(blobUrl);
-      }.bind(this));
+      });
     }
   };
   return DownloadManager;
 }();
 _preferences.Preferences._writeToStorage = function (prefObj) {
   return new Promise(function (resolve) {
     FirefoxCom.request('setPreferences', prefObj, resolve);
   });
@@ -3724,36 +3724,36 @@ var _preferences = __webpack_require__(7
 
 var HandTool = function HandToolClosure() {
   function HandTool(options) {
     this.container = options.container;
     this.eventBus = options.eventBus;
     this.wasActive = false;
     this.handTool = new _grab_to_pan.GrabToPan({
       element: this.container,
-      onActiveChanged: function (isActive) {
+      onActiveChanged: isActive => {
         this.eventBus.dispatch('handtoolchanged', { isActive: isActive });
-      }.bind(this)
+      }
     });
     this.eventBus.on('togglehandtool', this.toggle.bind(this));
-    Promise.all([_ui_utils.localized, _preferences.Preferences.get('enableHandToolOnLoad')]).then(function resolved(values) {
+    Promise.all([_ui_utils.localized, _preferences.Preferences.get('enableHandToolOnLoad')]).then(values => {
       if (values[1] === true) {
         this.handTool.activate();
       }
-    }.bind(this)).catch(function rejected(reason) {});
-    this.eventBus.on('presentationmodechanged', function (e) {
+    }).catch(function rejected(reason) {});
+    this.eventBus.on('presentationmodechanged', e => {
       if (e.switchInProgress) {
         return;
       }
       if (e.active) {
         this.enterPresentationMode();
       } else {
         this.exitPresentationMode();
       }
-    }.bind(this));
+    });
   }
   HandTool.prototype = {
     get isActive() {
       return !!this.handTool.active;
     },
     toggle: function HandTool_toggle() {
       this.handTool.toggle();
     },
@@ -3889,20 +3889,20 @@ var PDFAttachmentViewer = function PDFAt
         }
         var viewerUrl;
         viewerUrl = blobUrl + '?' + encodeURIComponent(filename);
         window.open(viewerUrl);
         return false;
       };
     },
     _bindLink: function PDFAttachmentViewer_bindLink(button, content, filename) {
-      button.onclick = function downloadFile(e) {
+      button.onclick = e => {
         this.downloadManager.downloadData(content, filename, '');
         return false;
-      }.bind(this);
+      };
     },
     render: function PDFAttachmentViewer_render(params) {
       params = params || {};
       var attachments = params.attachments || null;
       var attachmentsCount = 0;
       if (this.attachments) {
         var keepRenderedCapability = params.keepRenderedCapability === true;
         this.reset(keepRenderedCapability);
@@ -4631,24 +4631,24 @@ var PDFOutlineViewer = function PDFOutli
       }
       if (styleStr) {
         element.setAttribute('style', styleStr);
       }
     },
     _addToggleButton: function PDFOutlineViewer_addToggleButton(div) {
       var toggler = document.createElement('div');
       toggler.className = 'outlineItemToggler';
-      toggler.onclick = function (event) {
+      toggler.onclick = event => {
         event.stopPropagation();
         toggler.classList.toggle('outlineItemsHidden');
         if (event.shiftKey) {
           var shouldShowAll = !toggler.classList.contains('outlineItemsHidden');
           this._toggleOutlineItem(div, shouldShowAll);
         }
-      }.bind(this);
+      };
       div.insertBefore(toggler, div.firstChild);
     },
     _toggleOutlineItem: function PDFOutlineViewer_toggleOutlineItem(root, show) {
       this.lastToggleIsShow = show;
       var togglers = root.querySelectorAll('.outlineItemToggler');
       for (var i = 0, ii = togglers.length; i < ii; ++i) {
         togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden');
       }
@@ -5197,32 +5197,32 @@ var PDFPresentationMode = function PDFPr
     var contextMenuItems = options.contextMenuItems || null;
     this.active = false;
     this.args = null;
     this.contextMenuOpen = false;
     this.mouseScrollTimeStamp = 0;
     this.mouseScrollDelta = 0;
     this.touchSwipeState = null;
     if (contextMenuItems) {
-      contextMenuItems.contextFirstPage.addEventListener('click', function PDFPresentationMode_contextFirstPageClick(e) {
+      contextMenuItems.contextFirstPage.addEventListener('click', e => {
         this.contextMenuOpen = false;
         this.eventBus.dispatch('firstpage');
-      }.bind(this));
-      contextMenuItems.contextLastPage.addEventListener('click', function PDFPresentationMode_contextLastPageClick(e) {
+      });
+      contextMenuItems.contextLastPage.addEventListener('click', e => {
         this.contextMenuOpen = false;
         this.eventBus.dispatch('lastpage');
-      }.bind(this));
-      contextMenuItems.contextPageRotateCw.addEventListener('click', function PDFPresentationMode_contextPageRotateCwClick(e) {
+      });
+      contextMenuItems.contextPageRotateCw.addEventListener('click', e => {
         this.contextMenuOpen = false;
         this.eventBus.dispatch('rotatecw');
-      }.bind(this));
-      contextMenuItems.contextPageRotateCcw.addEventListener('click', function PDFPresentationMode_contextPageRotateCcwClick(e) {
+      });
+      contextMenuItems.contextPageRotateCcw.addEventListener('click', e => {
         this.contextMenuOpen = false;
         this.eventBus.dispatch('rotateccw');
-      }.bind(this));
+      });
     }
   }
   PDFPresentationMode.prototype = {
     request: function PDFPresentationMode_request() {
       if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) {
         return false;
       }
       this._addFullscreenChangeListeners();
@@ -5296,54 +5296,54 @@ var PDFPresentationMode = function PDFPr
         active: this.active,
         switchInProgress: !!this.switchInProgress
       });
     },
     _setSwitchInProgress: function PDFPresentationMode_setSwitchInProgress() {
       if (this.switchInProgress) {
         clearTimeout(this.switchInProgress);
       }
-      this.switchInProgress = setTimeout(function switchInProgressTimeout() {
+      this.switchInProgress = setTimeout(() => {
         this._removeFullscreenChangeListeners();
         delete this.switchInProgress;
         this._notifyStateChange();
-      }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
+      }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
     },
     _resetSwitchInProgress: function PDFPresentationMode_resetSwitchInProgress() {
       if (this.switchInProgress) {
         clearTimeout(this.switchInProgress);
         delete this.switchInProgress;
       }
     },
     _enter: function PDFPresentationMode_enter() {
       this.active = true;
       this._resetSwitchInProgress();
       this._notifyStateChange();
       this.container.classList.add(ACTIVE_SELECTOR);
-      setTimeout(function enterPresentationModeTimeout() {
+      setTimeout(() => {
         this.pdfViewer.currentPageNumber = this.args.page;
         this.pdfViewer.currentScaleValue = 'page-fit';
-      }.bind(this), 0);
+      }, 0);
       this._addWindowListeners();
       this._showControls();
       this.contextMenuOpen = false;
       this.container.setAttribute('contextmenu', 'viewerContextMenu');
       window.getSelection().removeAllRanges();
     },
     _exit: function PDFPresentationMode_exit() {
       var page = this.pdfViewer.currentPageNumber;
       this.container.classList.remove(ACTIVE_SELECTOR);
-      setTimeout(function exitPresentationModeTimeout() {
+      setTimeout(() => {
         this.active = false;
         this._removeFullscreenChangeListeners();
         this._notifyStateChange();
         this.pdfViewer.currentScaleValue = this.args.previousScale;
         this.pdfViewer.currentPageNumber = page;
         this.args = null;
-      }.bind(this), 0);
+      }, 0);
       this._removeWindowListeners();
       this._hideControls();
       this._resetMouseScrollState();
       this.container.removeAttribute('contextmenu');
       this.contextMenuOpen = false;
     },
     _mouseDown: function PDFPresentationMode_mouseDown(evt) {
       if (this.contextMenuOpen) {
@@ -5363,20 +5363,20 @@ var PDFPresentationMode = function PDFPr
       this.contextMenuOpen = true;
     },
     _showControls: function PDFPresentationMode_showControls() {
       if (this.controlsTimeout) {
         clearTimeout(this.controlsTimeout);
       } else {
         this.container.classList.add(CONTROLS_SELECTOR);
       }
-      this.controlsTimeout = setTimeout(function showControlsTimeout() {
+      this.controlsTimeout = setTimeout(() => {
         this.container.classList.remove(CONTROLS_SELECTOR);
         delete this.controlsTimeout;
-      }.bind(this), DELAY_BEFORE_HIDING_CONTROLS);
+      }, DELAY_BEFORE_HIDING_CONTROLS);
     },
     _hideControls: function PDFPresentationMode_hideControls() {
       if (!this.controlsTimeout) {
         return;
       }
       clearTimeout(this.controlsTimeout);
       this.container.classList.remove(CONTROLS_SELECTOR);
       delete this.controlsTimeout;
@@ -5704,26 +5704,26 @@ var PDFSidebar = function PDFSidebarClos
           this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS);
           break;
       }
     },
     _hideUINotification: function (view) {
       if (this.disableNotification) {
         return;
       }
-      var removeNotification = function (view) {
+      var removeNotification = view => {
         switch (view) {
           case SidebarView.OUTLINE:
             this.outlineButton.classList.remove(UI_NOTIFICATION_CLASS);
             break;
           case SidebarView.ATTACHMENTS:
             this.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS);
             break;
         }
-      }.bind(this);
+      };
       if (!this.isOpen && view !== null) {
         return;
       }
       this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);
       if (view !== null) {
         removeNotification(view);
         return;
       }
@@ -6161,31 +6161,31 @@ var PDFThumbnailViewer = function PDFThu
       if (this.pdfDocument) {
         this._cancelRendering();
         this._resetView();
       }
       this.pdfDocument = pdfDocument;
       if (!pdfDocument) {
         return Promise.resolve();
       }
-      return pdfDocument.getPage(1).then(function (firstPage) {
+      return pdfDocument.getPage(1).then(firstPage => {
         var pagesCount = pdfDocument.numPages;
         var viewport = firstPage.getViewport(1.0);
         for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
           var thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({
             container: this.container,
             id: pageNum,
             defaultViewport: viewport.clone(),
             linkService: this.linkService,
             renderingQueue: this.renderingQueue,
             disableCanvasToImageConversion: false
           });
           this.thumbnails.push(thumbnail);
         }
-      }.bind(this));
+      });
     },
     _cancelRendering: function PDFThumbnailViewer_cancelRendering() {
       for (var i = 0, ii = this.thumbnails.length; i < ii; i++) {
         if (this.thumbnails[i]) {
           this.thumbnails[i].cancelRendering();
         }
       }
     },
@@ -6210,31 +6210,31 @@ var PDFThumbnailViewer = function PDFThu
     _ensurePdfPageLoaded: function PDFThumbnailViewer_ensurePdfPageLoaded(thumbView) {
       if (thumbView.pdfPage) {
         return Promise.resolve(thumbView.pdfPage);
       }
       var pageNumber = thumbView.id;
       if (this._pagesRequests[pageNumber]) {
         return this._pagesRequests[pageNumber];
       }
-      var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {
+      var promise = this.pdfDocument.getPage(pageNumber).then(pdfPage => {
         thumbView.setPdfPage(pdfPage);
         this._pagesRequests[pageNumber] = null;
         return pdfPage;
-      }.bind(this));
+      });
       this._pagesRequests[pageNumber] = promise;
       return promise;
     },
     forceRendering: function () {
       var visibleThumbs = this._getVisibleThumbs();
       var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this.thumbnails, this.scroll.down);
       if (thumbView) {
-        this._ensurePdfPageLoaded(thumbView).then(function () {
+        this._ensurePdfPageLoaded(thumbView).then(() => {
           this.renderingQueue.renderView(thumbView);
-        }.bind(this));
+        });
         return true;
       }
       return false;
     }
   };
   return PDFThumbnailViewer;
 }();
 exports.PDFThumbnailViewer = PDFThumbnailViewer;
@@ -7154,21 +7154,21 @@ var TextLayerBuilder = function TextLaye
       this.textLayerRenderTask = (0, _pdfjs.renderTextLayer)({
         textContent: this.textContent,
         container: textLayerFrag,
         viewport: this.viewport,
         textDivs: this.textDivs,
         timeout: timeout,
         enhanceTextSelection: this.enhanceTextSelection
       });
-      this.textLayerRenderTask.promise.then(function () {
+      this.textLayerRenderTask.promise.then(() => {
         this.textLayerDiv.appendChild(textLayerFrag);
         this._finishRendering();
         this.updateMatches();
-      }.bind(this), function (reason) {});
+      }, function (reason) {});
     },
     cancel: function TextLayerBuilder_cancel() {
       if (this.textLayerRenderTask) {
         this.textLayerRenderTask.cancel();
         this.textLayerRenderTask = null;
       }
     },
     setTextContent: function TextLayerBuilder_setTextContent(textContent) {
@@ -7559,17 +7559,17 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;
 var ViewHistory = function ViewHistoryClosure() {
   function ViewHistory(fingerprint, cacheSize) {
     this.fingerprint = fingerprint;
     this.cacheSize = cacheSize || DEFAULT_VIEW_HISTORY_CACHE_SIZE;
     this.isInitializedPromiseResolved = false;
-    this.initializedPromise = this._readFromStorage().then(function (databaseStr) {
+    this.initializedPromise = this._readFromStorage().then(databaseStr => {
       this.isInitializedPromiseResolved = true;
       var database = JSON.parse(databaseStr || '{}');
       if (!('files' in database)) {
         database.files = [];
       }
       if (database.files.length >= this.cacheSize) {
         database.files.shift();
       }
@@ -7581,25 +7581,25 @@ var ViewHistory = function ViewHistoryCl
           break;
         }
       }
       if (typeof index !== 'number') {
         index = database.files.push({ fingerprint: this.fingerprint }) - 1;
       }
       this.file = database.files[index];
       this.database = database;
-    }.bind(this));
+    });
   }
   ViewHistory.prototype = {
     _writeToStorage: function ViewHistory_writeToStorage() {
-      return new Promise(function (resolve) {
+      return new Promise(resolve => {
         var databaseStr = JSON.stringify(this.database);
         sessionStorage.setItem('pdfjs.history', databaseStr);
         resolve();
-      }.bind(this));
+      });
     },
     _readFromStorage: function ViewHistory_readFromStorage() {
       return new Promise(function (resolve) {
         resolve(sessionStorage.getItem('pdfjs.history'));
       });
     },
     set: function ViewHistory_set(name, val) {
       if (!this.isInitializedPromiseResolved) {
--- a/browser/modules/DirectoryLinksProvider.jsm
+++ b/browser/modules/DirectoryLinksProvider.jsm
@@ -586,24 +586,24 @@ var DirectoryLinksProvider = {
       // Reset the cache of suggested tiles and enhanced images for this new set of links
       this._enhancedLinks.clear();
       this._suggestedLinks.clear();
       this._clearCampaignTimeout();
       this._avoidInadjacentSites = false;
 
       // Only check base domain for images when using the default pref
       let checkBase = !this.__linksURLModified;
-      let validityFilter = function(link) {
+      let validityFilter = link => {
         // Make sure the link url is allowed and images too if they exist
         return this.isURLAllowed(link.url, ALLOWED_LINK_SCHEMES, false) &&
                (!link.imageURI ||
                 this.isURLAllowed(link.imageURI, ALLOWED_IMAGE_SCHEMES, checkBase)) &&
                (!link.enhancedImageURI ||
                 this.isURLAllowed(link.enhancedImageURI, ALLOWED_IMAGE_SCHEMES, checkBase));
-      }.bind(this);
+      };
 
       rawLinks.suggested.filter(validityFilter).forEach((link, position) => {
         // Suggested sites must have an adgroup name.
         if (!link.adgroup_name) {
           return;
         }
 
         let sanitizeFlags = ParserUtils.SanitizerCidEmbedsOnly |
--- a/browser/modules/SocialService.jsm
+++ b/browser/modules/SocialService.jsm
@@ -383,21 +383,21 @@ this.SocialService = {
     if (SocialServiceInternal.providers[manifest.origin])
       throw new Error("SocialService.addProvider: provider with this origin already exists");
 
     // enable the api when a provider is enabled
     let provider = new SocialProvider(manifest);
     SocialServiceInternal.providers[provider.origin] = provider;
     ActiveProviders.add(provider.origin);
 
-    this.getOrderedProviderList(function(providers) {
+    this.getOrderedProviderList(providers => {
       this._notifyProviderListeners("provider-enabled", provider.origin, providers);
       if (onDone)
         onDone(provider);
-    }.bind(this));
+    });
   },
 
   // Removes a provider with the given origin, and notifies when the removal is
   // complete.
   disableProvider: function disableProvider(origin, onDone) {
     if (!(origin in SocialServiceInternal.providers))
       throw new Error("SocialService.disableProvider: no provider with origin " + origin + " exists!");
 
@@ -416,21 +416,21 @@ this.SocialService = {
 
     if (addon) {
       // we have to do this now so the addon manager ui will update an uninstall
       // correctly.
       addon.pendingOperations -= AddonManager.PENDING_DISABLE;
       AddonManagerPrivate.callAddonListeners("onDisabled", addon);
     }
 
-    this.getOrderedProviderList(function(providers) {
+    this.getOrderedProviderList(providers => {
       this._notifyProviderListeners("provider-disabled", origin, providers);
       if (onDone)
         onDone();
-    }.bind(this));
+    });
   },
 
   // Returns a single provider object with the specified origin.  The provider
   // must be "installed" (ie, in ActiveProviders)
   getProvider: function getProvider(origin, onDone) {
     schedule((function() {
       onDone(SocialServiceInternal.providers[origin] || null);
     }));
@@ -570,33 +570,33 @@ this.SocialService = {
     if (addon && addon.blocklistState == Ci.nsIBlocklistService.STATE_BLOCKED)
       throw new Error("installProvider: provider with origin [" +
                       data.origin + "] is blocklisted");
     // manifestFromData call above will enforce correct origin. To support
     // activation from about: uris, we need to be sure to use the updated
     // origin on the manifest.
     data.manifest = manifest;
     let id = getAddonIDFromOrigin(manifest.origin);
-    AddonManager.getAddonByID(id, function(aAddon) {
+    AddonManager.getAddonByID(id, aAddon => {
       if (aAddon && aAddon.userDisabled) {
         aAddon.cancelUninstall();
         aAddon.userDisabled = false;
       }
-      schedule(function() {
+      schedule(() => {
         try {
           this._installProvider(data, options, aManifest => {
               this._notifyProviderListeners("provider-installed", aManifest.origin);
               installCallback(aManifest);
           });
         } catch (e) {
           Cu.reportError("Activation failed: " + e);
           installCallback(null);
         }
-      }.bind(this));
-    }.bind(this));
+      });
+    });
   },
 
   _installProvider(data, options, installCallback) {
     if (!data.manifest)
       throw new Error("Cannot install provider without manifest data");
 
     if (data.installType == "foreign" && !Services.prefs.getBoolPref("social.remote-install.enabled"))
       throw new Error("Remote install of services is disabled");
@@ -1047,19 +1047,19 @@ AddonWrapper.prototype = {
     }
     return val;
   },
 
   uninstall(aCallback) {
     let prefName = getPrefnameFromOrigin(this.manifest.origin);
     if (Services.prefs.prefHasUserValue(prefName)) {
       if (ActiveProviders.has(this.manifest.origin)) {
-        SocialService.disableProvider(this.manifest.origin, function() {
+        SocialService.disableProvider(this.manifest.origin, () => {
           SocialAddonProvider.removeAddon(this, aCallback);
-        }.bind(this));
+        });
       } else {
         SocialAddonProvider.removeAddon(this, aCallback);
       }
     } else {
       schedule(aCallback);
     }
   },
 
--- a/devtools/client/commandline/test/helpers.js
+++ b/devtools/client/commandline/test/helpers.js
@@ -263,42 +263,42 @@ var { helpers, assert } = (function () {
  * A helper for calling addEventListener and then removeEventListener as soon
  * as the event is called, passing the results on as a promise
  * @param element The DOM element to listen on
  * @param event The name of the event to listen for
  * @param useCapture Should we use the capturing phase?
  * @return A promise resolved with the event object when the event first happens
  */
   helpers.listenOnce = function (element, event, useCapture) {
-    return new Promise(function (resolve, reject) {
+    return new Promise((resolve, reject) => {
       var onEvent = function (ev) {
         element.removeEventListener(event, onEvent, useCapture);
         resolve(ev);
       };
       element.addEventListener(event, onEvent, useCapture);
-    }.bind(this));
+    });
   };
 
 /**
  * A wrapper for calling Services.obs.[add|remove]Observer using promises.
  * @param topic The topic parameter to Services.obs.addObserver
  * @param ownsWeak The ownsWeak parameter to Services.obs.addObserver with a
  * default value of false
  * @return a promise that resolves when the ObserverService first notifies us
  * of the topic. The value of the promise is the first parameter to the observer
  * function other parameters are dropped.
  */
   helpers.observeOnce = function (topic, ownsWeak = false) {
-    return new Promise(function (resolve, reject) {
+    return new Promise((resolve, reject) => {
       let resolver = function (subject) {
         Services.obs.removeObserver(resolver, topic);
         resolve(subject);
       };
       Services.obs.addObserver(resolver, topic, ownsWeak);
-    }.bind(this));
+    });
   };
 
 /**
  * Takes a function that uses a callback as its last parameter, and returns a
  * new function that returns a promise instead
  */
   helpers.promiseify = function (functionWithLastParamCallback, scope) {
     return function () {
@@ -548,19 +548,19 @@ var { helpers, assert } = (function () {
       return assignment.getPredictions(context).then(function (predictions) {
         return predictions.map(function (prediction) {
           return prediction.name;
         });
       });
     },
 
     unassigned: function (options) {
-      return options.requisition._unassigned.map(function (assignment) {
+      return options.requisition._unassigned.map(assignment => {
         return assignment.arg.toString();
-      }.bind(this));
+      });
     },
 
     outputState: function (options) {
       var outputData = options.automator.focusManager._shouldShowOutput();
       return outputData.visible + ":" + outputData.reason;
     },
 
     tooltipState: function (options) {
@@ -599,17 +599,17 @@ var { helpers, assert } = (function () {
     var command = requisition.commandAssignment.value;
     var cursor = helpers._actual.cursor(options);
     var input = helpers._actual.input(options);
     var padding = new Array(input.length + 1).join(" ");
 
     var hintsPromise = helpers._actual.hints(options);
     var predictionsPromise = helpers._actual.predictions(options);
 
-    return Promise.all([ hintsPromise, predictionsPromise ]).then(function (values) {
+    return Promise.all([ hintsPromise, predictionsPromise ]).then(values => {
       var hints = values[0];
       var predictions = values[1];
       var output = "";
 
       output += "return helpers.audit(options, [\n";
       output += "  {\n";
 
       if (cursor === input.length) {
@@ -669,17 +669,17 @@ var { helpers, assert } = (function () {
       output += "      output: '',\n";
       output += "      type: 'string',\n";
       output += "      error: false\n";
       output += "    }\n";
       output += "  }\n";
       output += "]);";
 
       return output;
-    }.bind(this), util.errorHandler);
+    }, util.errorHandler);
   };
 
 /**
  * Simulate focusing the input field
  */
   helpers.focusInput = function (options) {
     checkOptions(options);
     options.automator.focus();
@@ -996,17 +996,17 @@ var { helpers, assert } = (function () {
     }
 
     var origLogErrors = cli.logErrors;
     if (expected.error) {
       cli.logErrors = false;
     }
 
     try {
-      return requisition.exec({ hidden: true }).then(function (output) {
+      return requisition.exec({ hidden: true }).then(output => {
         if ("type" in expected) {
           assert.is(output.type,
                   expected.type,
                   "output.type for: " + name);
         }
 
         if ("error" in expected) {
           assert.is(output.error,
@@ -1079,17 +1079,17 @@ var { helpers, assert } = (function () {
             doTestNot(expected.notinoutput, textOutput);
           }
 
           if (expected.error) {
             cli.logErrors = origLogErrors;
           }
           return { output: output, text: textOutput };
         });
-      }.bind(this)).then(function (data) {
+      }).then(function (data) {
         if (expected.error) {
           cli.logErrors = origLogErrors;
         }
 
         return data;
       });
     }
   catch (ex) {
--- a/devtools/client/commandline/test/mockCommands.js
+++ b/devtools/client/commandline/test/mockCommands.js
@@ -42,34 +42,34 @@ mockCommands.setup = function (requisiti
 mockCommands.shutdown = function (requisition) {
   requisition.system.removeItems(mockCommands.items);
 };
 
 function createExec(name) {
   return function (args, context) {
     var promises = [];
 
-    Object.keys(args).map(function (argName) {
+    Object.keys(args).map(argName => {
       var value = args[argName];
       var type = this.getParameterByName(argName).type;
       var promise = Promise.resolve(type.stringify(value, context));
-      promises.push(promise.then(function (str) {
+      promises.push(promise.then(str => {
         return { name: argName, value: str };
-      }.bind(this)));
-    }.bind(this));
+      }));
+    });
 
-    return Promise.all(promises).then(function (data) {
+    return Promise.all(promises).then(data => {
       var argValues = {};
       data.forEach(function (entry) { argValues[entry.name] = entry.value; });
 
       return context.typedData("testCommandOutput", {
         name: name,
         args: argValues
       });
-    }.bind(this));
+    });
   };
 }
 
 mockCommands.items = [
   {
     item: "converter",
     from: "testCommandOutput",
     to: "dom",
--- a/devtools/client/debugger/new/pretty-print-worker.js
+++ b/devtools/client/debugger/new/pretty-print-worker.js
@@ -89,17 +89,17 @@ return /******/ (function(modules) { // 
 
 	  if (true) {
 	    !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
 	  } else if (typeof exports === "object") {
 	    module.exports = factory();
 	  } else {
 	    root.prettyFast = factory();
 	  }
-	}(this, function () {
+	}(this, () => {
 	  "use strict";
 
 	  var acorn = this.acorn || __webpack_require__(803);
 	  var sourceMap = this.sourceMap || __webpack_require__(804);
 	  var SourceNode = sourceMap.SourceNode;
 
 	  // If any of these tokens are seen before a "[" token, we know that "[" token
 	  // is the start of an array literal, rather than a property access.
@@ -947,17 +947,17 @@ return /******/ (function(modules) { // 
 	        addedNewline = true;
 	        commentQueue.splice(0, commentQueue.length);
 	      }
 	    }
 
 	    return result.toStringWithSourceMap({ file: options.url });
 	  };
 
-	}.bind(this)));
+	}));
 
 
 /***/ },
 
 /***/ 803:
 /***/ function(module, exports, __webpack_require__) {
 
 	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Acorn is a tiny, fast JavaScript parser written in JavaScript.
--- a/devtools/client/devtools-startup.js
+++ b/devtools/client/devtools-startup.js
@@ -43,26 +43,26 @@ DevToolsStartup.prototype = {
       // We get an error if the option is given but not followed by a value.
       // By catching and trying again, the value is effectively optional.
       debuggerServerFlag = cmdLine.handleFlag("start-debugger-server", false);
     }
     if (debuggerServerFlag) {
       this.handleDebuggerServerFlag(cmdLine, debuggerServerFlag);
     }
 
-    let onStartup = function (window) {
+    let onStartup = window => {
       Services.obs.removeObserver(onStartup,
                                   "browser-delayed-startup-finished");
       // Ensure loading core module once firefox is ready
       this.initDevTools();
 
       if (devtoolsFlag) {
         this.handleDevToolsFlag(window);
       }
-    }.bind(this);
+    };
     Services.obs.addObserver(onStartup, "browser-delayed-startup-finished");
   },
 
   initDevTools: function () {
     let { loader } = Cu.import("resource://devtools/shared/Loader.jsm", {});
     // Ensure loading main devtools module that hooks up into browser UI
     // and initialize all devtools machinery.
     loader.require("devtools/client/framework/devtools-browser");
--- a/devtools/client/inspector/rules/views/rule-editor.js
+++ b/devtools/client/inspector/rules/views/rule-editor.js
@@ -105,23 +105,23 @@ RuleEditor.prototype = {
     // Give a relative position for the inplace editor's measurement
     // span to be placed absolutely against.
     this.element.style.position = "relative";
 
     // Add the source link.
     this.source = createChild(this.element, "div", {
       class: "ruleview-rule-source theme-link"
     });
-    this.source.addEventListener("click", function () {
+    this.source.addEventListener("click", () => {
       if (this.source.hasAttribute("unselectable")) {
         return;
       }
       let rule = this.rule.domRule;
       this.ruleView.emit("ruleview-linked-clicked", rule);
-    }.bind(this));
+    });
     let sourceLabel = this.doc.createElement("span");
     sourceLabel.classList.add("ruleview-rule-source-label");
     this.source.appendChild(sourceLabel);
 
     this.updateSourceLink();
 
     let code = createChild(this.element, "div", {
       class: "ruleview-code"
--- a/devtools/client/performance/modules/logic/telemetry.js
+++ b/devtools/client/performance/modules/logic/telemetry.js
@@ -93,27 +93,27 @@ PerformanceTelemetry.prototype.recordLog
   if (!flags.testing) {
     throw new Error("Can only record telemetry logs in tests.");
   }
 
   let originalLog = this._telemetry.log;
   let originalLogKeyed = this._telemetry.logKeyed;
   this._log = {};
 
-  this._telemetry.log = (function (histo, data) {
+  this._telemetry.log = (histo, data) => {
     let results = this._log[histo] = this._log[histo] || [];
     results.push(data);
     originalLog(histo, data);
-  }).bind(this);
+  };
 
-  this._telemetry.logKeyed = (function (histo, key, data) {
+  this._telemetry.logKeyed = (histo, key, data) => {
     let results = this._log[histo] = this._log[histo] || [];
     results.push([key, data]);
     originalLogKeyed(histo, key, data);
-  }).bind(this);
+  };
 };
 
 PerformanceTelemetry.prototype.getLogs = function () {
   if (!flags.testing) {
     throw new Error("Can only get telemetry logs in tests.");
   }
 
   return this._log;
--- a/devtools/client/styleeditor/StyleEditorUI.jsm
+++ b/devtools/client/styleeditor/StyleEditorUI.jsm
@@ -515,17 +515,17 @@ StyleEditorUI.prototype = {
     ordinal = ordinal == -1 ? Number.MAX_SAFE_INTEGER : ordinal;
     // add new sidebar item and editor to the UI
     this._view.appendTemplatedItem(STYLE_EDITOR_TEMPLATE, {
       data: {
         editor: editor
       },
       disableAnimations: this._alwaysDisableAnimations,
       ordinal: ordinal,
-      onCreate: function (summary, details, data) {
+      onCreate: (summary, details, data) => {
         let createdEditor = data.editor;
         createdEditor.summary = summary;
         createdEditor.details = details;
 
         wire(summary, ".stylesheet-enabled", function onToggleDisabled(event) {
           event.stopPropagation();
           event.target.blur();
 
@@ -590,19 +590,19 @@ StyleEditorUI.prototype = {
 
         // If this is the first stylesheet and there is no pending request to
         // select a particular style sheet, select this sheet.
         if (!this.selectedEditor && !this._styleSheetBoundToSelect
             && createdEditor.styleSheet.styleSheetIndex == 0) {
           this._selectEditor(createdEditor);
         }
         this.emit("editor-added", createdEditor);
-      }.bind(this),
+      },
 
-      onShow: function (summary, details, data) {
+      onShow: (summary, details, data) => {
         let showEditor = data.editor;
         this.selectedEditor = showEditor;
 
         Task.spawn(function* () {
           if (!showEditor.sourceEditor) {
             // only initialize source editor when we switch to this view
             let inputElement =
                 details.querySelector(".stylesheet-editor-input");
@@ -632,17 +632,17 @@ StyleEditorUI.prototype = {
             let ruleCount = showEditor.styleSheet.ruleCount;
             if (lineCount >= ruleCount) {
               showEditor.addUnusedRegions(reports);
             } else {
               this.emit("error", { key: "error-compressed", level: "info" });
             }
           }
         }.bind(this)).then(null, e => console.error(e));
-      }.bind(this)
+      }
     });
   },
 
   /**
    * Switch to the editor that has been marked to be selected.
    *
    * @return {Promise}
    *         Promise that will resolve when the editor is selected.
--- a/devtools/shared/gcli/commands/calllog.js
+++ b/devtools/shared/gcli/commands/calllog.js
@@ -26,20 +26,20 @@ exports.items = [
     runAt: "client",
     name: "calllog start",
     description: l10n.lookup("calllogStartDesc"),
 
     exec: function (args, context) {
       let contentWindow = context.environment.window;
 
       let dbg = new Debugger(contentWindow);
-      dbg.onEnterFrame = function (frame) {
+      dbg.onEnterFrame = frame => {
         // BUG 773652 -  Make the output from the GCLI calllog command nicer
         contentWindow.console.log("Method call: " + this.callDescription(frame));
-      }.bind(this);
+      };
 
       debuggers.push(dbg);
 
       let gBrowser = context.environment.chromeDocument.defaultView.gBrowser;
       let target = TargetFactory.forTab(gBrowser.selectedTab);
       gDevTools.showToolbox(target, "webconsole");
 
       return l10n.lookup("calllogStartReply");
@@ -157,21 +157,21 @@ exports.items = [
         }
 
         globalObj = Cu.getGlobalForObject(returnVal);
       }
 
       let dbg = new Debugger(globalObj);
       chromeDebuggers.push(dbg);
 
-      dbg.onEnterFrame = function (frame) {
+      dbg.onEnterFrame = frame => {
         // BUG 773652 -  Make the output from the GCLI calllog command nicer
         contentWindow.console.log(l10n.lookup("callLogChromeMethodCall") +
                                   ": " + this.callDescription(frame));
-      }.bind(this);
+      };
 
       let gBrowser = context.environment.chromeDocument.defaultView.gBrowser;
       let target = TargetFactory.forTab(gBrowser.selectedTab);
       gDevTools.showToolbox(target, "webconsole");
 
       return l10n.lookup("calllogChromeStartReply");
     },
 
--- a/devtools/shared/gcli/source/lib/gcli/cli.js
+++ b/devtools/shared/gcli/source/lib/gcli/cli.js
@@ -195,27 +195,27 @@ Assignment.prototype.getPredictionRanked
   if (rank == null) {
     rank = 0;
   }
 
   if (this.isInName()) {
     return Promise.resolve(undefined);
   }
 
-  return this.getPredictions(context).then(function(predictions) {
+  return this.getPredictions(context).then(predictions => {
     if (predictions.length === 0) {
       return undefined;
     }
 
     rank = rank % predictions.length;
     if (rank < 0) {
       rank = predictions.length + rank;
     }
     return predictions[rank];
-  }.bind(this));
+  });
 };
 
 /**
  * Some places want to take special action if we are in the name part of a
  * named argument (i.e. the '--foo' bit).
  * Currently this does not take actual cursor position into account, it just
  * assumes that the cursor is at the end. In the future we will probably want
  * to take this into account.
@@ -869,33 +869,33 @@ Requisition.prototype.toCanonicalString 
   if (cmd === '{') {
     var scriptSuffix = this.getAssignment(0).arg.suffix;
     lineSuffix = (scriptSuffix.indexOf('}') === -1) ? ' }' : '';
   }
 
   var ctx = this.executionContext;
 
   // First stringify all the arguments
-  var argPromise = util.promiseEach(this.getAssignments(), function(assignment) {
+  var argPromise = util.promiseEach(this.getAssignments(), assignment => {
     // Bug 664377: This will cause problems if there is a non-default value
     // after a default value. Also we need to decide when to use
     // named parameters in place of positional params. Both can wait.
     if (assignment.value === assignment.param.defaultValue) {
       return '';
     }
 
     var val = assignment.param.type.stringify(assignment.value, ctx);
-    return Promise.resolve(val).then(function(str) {
+    return Promise.resolve(val).then(str => {
       return ' ' + str;
-    }.bind(this));
-  }.bind(this));
+    });
+  });
 
-  return argPromise.then(function(strings) {
+  return argPromise.then(strings => {
     return cmd + strings.join('') + lineSuffix;
-  }.bind(this));
+  });
 };
 
 /**
  * Reconstitute the input from the args
  */
 Requisition.prototype.toString = function() {
   if (!this._args) {
     throw new Error('toString requires a command line. See source.');
@@ -918,19 +918,19 @@ Object.defineProperty(Requisition.protot
         return arg._summaryJson;
       }),
       _command: this.commandAssignment._summaryJson,
       _unassigned: this._unassigned.forEach(function(assignment) {
         return assignment._summaryJson;
       })
     };
 
-    Object.keys(this._assignments).forEach(function(name) {
+    Object.keys(this._assignments).forEach(name => {
       summary[name] = this.getAssignment(name)._summaryJson;
-    }.bind(this));
+    });
 
     return summary;
   },
   enumerable: true
 });
 
 /**
  * When any assignment changes, we might need to update the _args array to
@@ -1025,27 +1025,27 @@ Requisition.prototype.setAssignment = fu
         }
         this._args[index] = replacementArgs[i];
       }
     }
   }
 
   var updateId = options.internal ? null : this._beginChange();
 
-  var setAssignmentInternal = function(conversion) {
+  var setAssignmentInternal = conversion => {
     if (options.internal || this._isChangeCurrent(updateId)) {
       this._setAssignmentInternal(assignment, conversion);
     }
 
     if (!options.internal) {
       this._endChangeCheckOrder(updateId);
     }
 
     return Promise.resolve(undefined);
-  }.bind(this);
+  };
 
   if (arg == null) {
     var blank = assignment.param.type.getBlank(this.executionContext);
     return setAssignmentInternal(blank);
   }
 
   if (typeof arg.getStatus === 'function') {
     // It's not really an arg, it's a conversion already
@@ -1231,17 +1231,17 @@ Requisition.prototype.getInputStatusMark
 Requisition.prototype.getStateData = function(start, rank) {
   var typed = this.toString();
   var current = this.getAssignmentAt(start);
   var context = this.executionContext;
   var predictionPromise = (typed.trim().length !== 0) ?
                           current.getPredictionRanked(context, rank) :
                           Promise.resolve(null);
 
-  return predictionPromise.then(function(prediction) {
+  return predictionPromise.then(prediction => {
     // directTabText is for when the current input is a prefix of the completion
     // arrowTabText is for when we need to use an -> to show what will be used
     var directTabText = '';
     var arrowTabText = '';
     var emptyParameters = [];
 
     if (typed.trim().length !== 0) {
       var cArg = current.arg;
@@ -1299,17 +1299,17 @@ Requisition.prototype.getStateData = fun
     }
 
     // Calculate the list of parameters to be filled in
     // We generate an array of emptyParameter markers for each positional
     // parameter to the current command.
     // Generally each emptyParameter marker begins with a space to separate it
     // from whatever came before, unless what comes before ends in a space.
 
-    this.getAssignments().forEach(function(assignment) {
+    this.getAssignments().forEach(assignment => {
       // Named arguments are handled with a group [options] marker
       if (!assignment.param.isPositionalAllowed) {
         return;
       }
 
       // No hints if we've got content for this parameter
       if (assignment.arg.toString().trim() !== '') {
         return;
@@ -1320,17 +1320,17 @@ Requisition.prototype.getStateData = fun
         return;
       }
 
       var text = (assignment.param.isDataRequired) ?
           '<' + assignment.param.name + '>\u00a0' :
           '[' + assignment.param.name + ']\u00a0';
 
       emptyParameters.push(text);
-    }.bind(this));
+    });
 
     var command = this.commandAssignment.value;
     var addOptionsMarker = false;
 
     // We add an '[options]' marker when there are named parameters that are
     // not filled in and not hidden, and we don't have any directTabText
     if (command && command.hasNamedParameters) {
       command.params.forEach(function(param) {
@@ -1354,17 +1354,17 @@ Requisition.prototype.getStateData = fun
 
     return {
       statusMarkup: this.getInputStatusMarkup(start),
       unclosedJs: unclosedJs,
       directTabText: directTabText,
       arrowTabText: arrowTabText,
       emptyParameters: emptyParameters
     };
-  }.bind(this));
+  });
 };
 
 /**
  * Pressing TAB sometimes requires that we add a space to denote that we're on
  * to the 'next thing'.
  * @param assignment The assignment to which to append the space
  */
 Requisition.prototype._addSpace = function(assignment) {
@@ -1395,17 +1395,17 @@ Requisition.prototype._addSpace = functi
  * @return A promise which completes (with undefined) when any outstanding
  * completion tasks are done.
  */
 Requisition.prototype.complete = function(cursor, rank) {
   var assignment = this.getAssignmentAt(cursor.start);
 
   var context = this.executionContext;
   var predictionPromise = assignment.getPredictionRanked(context, rank);
-  return predictionPromise.then(function(prediction) {
+  return predictionPromise.then(prediction => {
     var outstanding = [];
 
     // Note: Since complete is asynchronous we should perhaps have a system to
     // bail out of making changes if the command line has changed since TAB
     // was pressed. It's not yet clear if this will be a problem.
 
     if (prediction == null) {
       // No predictions generally means we shouldn't change anything on TAB,
@@ -1431,51 +1431,51 @@ Requisition.prototype.complete = functio
       // Mutate this argument to hold the completion
       var arg = assignment.arg.beget({
         text: prediction.name,
         dontQuote: (assignment === this.commandAssignment)
       });
       var assignPromise = this.setAssignment(assignment, arg);
 
       if (!prediction.incomplete) {
-        assignPromise = assignPromise.then(function() {
+        assignPromise = assignPromise.then(() => {
           // The prediction is complete, add a space to let the user move-on
-          return this._addSpace(assignment).then(function() {
+          return this._addSpace(assignment).then(() => {
             // Bug 779443 - Remove or explain the re-parse
             if (assignment instanceof UnassignedAssignment) {
               return this.update(this.toString());
             }
-          }.bind(this));
-        }.bind(this));
+          });
+        });
       }
 
       outstanding.push(assignPromise);
     }
 
-    return Promise.all(outstanding).then(function() {
+    return Promise.all(outstanding).then(() => {
       return true;
-    }.bind(this));
-  }.bind(this));
+    });
+  });
 };
 
 /**
  * Replace the current value with the lower value if such a concept exists.
  */
 Requisition.prototype.nudge = function(assignment, by) {
   var ctx = this.executionContext;
   var val = assignment.param.type.nudge(assignment.value, by, ctx);
-  return Promise.resolve(val).then(function(replacement) {
+  return Promise.resolve(val).then(replacement => {
     if (replacement != null) {
       var val = assignment.param.type.stringify(replacement, ctx);
-      return Promise.resolve(val).then(function(str) {
+      return Promise.resolve(val).then(str => {
         var arg = assignment.arg.beget({ text: str });
         return this.setAssignment(assignment, arg);
-      }.bind(this));
+      });
     }
-  }.bind(this));
+  });
 };
 
 /**
  * Helper to find the 'data-command' attribute, used by |update()|
  */
 function getDataCommandAttribute(element) {
   var command = element.getAttribute('data-command');
   if (!command) {
@@ -1486,20 +1486,20 @@ function getDataCommandAttribute(element
 }
 
 /**
  * Designed to be called from context.update(). Acts just like update() except
  * that it also calls onExternalUpdate() to inform the UI of an unexpected
  * change to the current command.
  */
 Requisition.prototype._contextUpdate = function(typed) {
-  return this.update(typed).then(function(reply) {
+  return this.update(typed).then(reply => {
     this.onExternalUpdate({ typed: typed });
     return reply;
-  }.bind(this));
+  });
 };
 
 /**
  * Called by the UI when ever the user interacts with a command line input
  * @param typed The contents of the input field OR an HTML element (or an event
  * that targets an HTML element) which has a data-command attribute or a child
  * with the same that contains the command to update with
  */
@@ -1515,19 +1515,19 @@ Requisition.prototype.update = function(
 
   var updateId = this._beginChange();
 
   this._args = exports.tokenize(typed);
   var args = this._args.slice(0); // i.e. clone
 
   this._split(args);
 
-  return this._assign(args).then(function() {
+  return this._assign(args).then(() => {
     return this._endChangeCheckOrder(updateId);
-  }.bind(this));
+  });
 };
 
 /**
  * Similar to update('') except that it's guaranteed to execute synchronously
  */
 Requisition.prototype.clear = function() {
   var arg = new Argument('', '', '');
   this._args = [ arg ];
@@ -1821,19 +1821,19 @@ Requisition.prototype._split = function(
 
   this._setAssignmentInternal(this.commandAssignment, conversion);
 };
 
 /**
  * Add all the passed args to the list of unassigned assignments.
  */
 Requisition.prototype._addUnassignedArgs = function(args) {
-  args.forEach(function(arg) {
+  args.forEach(arg => {
     this._unassigned.push(new UnassignedAssignment(this, arg));
-  }.bind(this));
+  });
 
   return RESOLVED;
 };
 
 /**
  * Work out which arguments are applicable to which parameters.
  */
 Requisition.prototype._assign = function(args) {
@@ -1921,17 +1921,17 @@ Requisition.prototype._assign = function
         else {
           return this._addUnassignedArgs(arg.getArgs());
         }
       }
     }
   }, this);
 
   // What's left are positional parameters: assign in order
-  var positionalDone = namedDone.then(function() {
+  var positionalDone = namedDone.then(() => {
     return util.promiseEach(unassignedParams, function(name) {
       var assignment = this.getAssignment(name);
 
       // If not set positionally, and we can't set it non-positionally,
       // we have to default it to prevent previous values surviving
       if (!assignment.param.isPositionalAllowed) {
         this._setBlankAssignment(assignment);
         return RESOLVED;
@@ -1967,30 +1967,30 @@ Requisition.prototype._assign = function
       if (isIncompleteName) {
         this._unassigned.push(new UnassignedAssignment(this, arg));
         return RESOLVED;
       }
       else {
         return this.setAssignment(assignment, arg, noArgUp);
       }
     }, this);
-  }.bind(this));
+  });
 
   // Now we need to assign the array argument (if any)
-  var arrayDone = positionalDone.then(function() {
+  var arrayDone = positionalDone.then(() => {
     return util.promiseEach(Object.keys(arrayArgs), function(name) {
       var assignment = this.getAssignment(name);
       return this.setAssignment(assignment, arrayArgs[name], noArgUp);
     }, this);
-  }.bind(this));
+  });
 
   // What's left is can't be assigned, but we need to officially unassign them
-  return arrayDone.then(function() {
+  return arrayDone.then(() => {
     return this._addUnassignedArgs(args);
-  }.bind(this));
+  });
 };
 
 /**
  * Entry point for keyboard accelerators or anything else that wants to execute
  * a command.
  * @param options Object describing how the execution should be handled.
  * (optional). Contains some of the following properties:
  * - hidden (boolean, default=false) Should the output be hidden from the
@@ -2069,26 +2069,26 @@ Requisition.prototype.exec = function(op
     output.complete(data, true);
     return output;
   };
 
   if (this.status !== Status.VALID) {
     var ex = new Error(this.getStatusMessage());
     // We only reject a call to exec if GCLI breaks. Errors with commands are
     // exposed in the 'error' status of the Output object
-    return Promise.resolve(onError(ex)).then(function(output) {
+    return Promise.resolve(onError(ex)).then(output => {
       this.clear();
       return output;
-    }.bind(this));
+    });
   }
   else {
     try {
-      return host.exec(function() {
+      return host.exec(() => {
         return command.exec(args, this.executionContext);
-      }.bind(this)).then(onDone, onError);
+      }).then(onDone, onError);
     }
     catch (ex) {
       var data = (typeof ex.message === 'string' && ex.stack != null) ?
                  ex.message : ex;
       return Promise.resolve(onError(data, ex));
     }
     finally {
       this.clear();
@@ -2115,19 +2115,19 @@ Requisition.prototype._contextUpdateExec
 
 /**
  * A shortcut for calling update, resolving the promise and then exec.
  * @param input The string to execute
  * @param options Passed to exec
  * @return A promise of an output object
  */
 Requisition.prototype.updateExec = function(input, options) {
-  return this.update(input).then(function() {
+  return this.update(input).then(() => {
     return this.exec(options);
-  }.bind(this));
+  });
 };
 
 exports.Requisition = Requisition;
 
 /**
  * A simple object to hold information about the output of a command
  */
 function Output(options) {
@@ -2139,19 +2139,19 @@ function Output(options) {
   this.hidden = options.hidden === true ? true : false;
 
   this.type = undefined;
   this.data = undefined;
   this.completed = false;
   this.error = false;
   this.start = new Date();
 
-  this.promise = new Promise(function(resolve, reject) {
+  this.promise = new Promise((resolve, reject) => {
     this._resolve = resolve;
-  }.bind(this));
+  });
 }
 
 /**
  * Called when there is data to display, and the command has finished executing
  * See changed() for details on parameters.
  */
 Output.prototype.complete = function(data, error) {
   this.end = new Date();
--- a/devtools/shared/gcli/source/lib/gcli/commands/commands.js
+++ b/devtools/shared/gcli/source/lib/gcli/commands/commands.js
@@ -92,24 +92,24 @@ function Command(types, commandSpec) {
 
   // At this point this.params has nested param groups. We want to flatten it
   // out and replace the param object literals with Parameter objects
   var paramSpecs = this.params;
   this.params = [];
   this.paramGroups = {};
   this._shortParams = {};
 
-  var addParam = function(param) {
+  var addParam = param => {
     var groupName = param.groupName || l10n.lookup('canonDefaultGroupName');
     this.params.push(param);
     if (!this.paramGroups.hasOwnProperty(groupName)) {
       this.paramGroups[groupName] = [];
     }
     this.paramGroups[groupName].push(param);
-  }.bind(this);
+  };
 
   // Track if the user is trying to mix default params and param groups.
   // All the non-grouped parameters must come before all the param groups
   // because non-grouped parameters can be assigned positionally, so their
   // index is important. We don't want 'holes' in the order caused by
   // parameter groups.
   var usingGroups = false;
 
@@ -180,21 +180,21 @@ Command.prototype.toJson = function(cust
   if (this.manual != null) {
     json.manual = this.manual;
   }
   if (this.hidden != null) {
     json.hidden = this.hidden;
   }
 
   if (Array.isArray(customProps)) {
-    customProps.forEach(function(prop) {
+    customProps.forEach(prop => {
       if (this[prop] != null) {
         json[prop] = this[prop];
       }
-    }.bind(this));
+    });
   }
 
   return json;
 };
 
 /**
  * Easy way to lookup parameters by full name
  */
@@ -464,22 +464,22 @@ Commands.prototype.getAll = function() {
  * instances of Command/Parameters) so we can remote them.
  * @param customProps Array of strings containing additional properties which,
  * if specified in the command spec, will be included in the JSON. Normally we
  * transfer only the properties required for GCLI to function.
  */
 Commands.prototype.getCommandSpecs = function(customProps) {
   var commandSpecs = [];
 
-  Object.keys(this._commands).forEach(function(name) {
+  Object.keys(this._commands).forEach(name => {
     var command = this._commands[name];
     if (!command.noRemote) {
       commandSpecs.push(command.toJson(customProps));
     }
-  }.bind(this));
+  });
 
   return commandSpecs;
 };
 
 /**
  * Add a set of commands that are executed somewhere else, optionally with a
  * command prefix to distinguish these commands from a local set of commands.
  * @param commandSpecs Presumably as obtained from getCommandSpecs
@@ -502,57 +502,57 @@ Commands.prototype.addProxyCommands = fu
     this.add({
       name: prefix,
       isProxy: true,
       description: l10n.lookupFormat('canonProxyDesc', [ to ]),
       manual: l10n.lookupFormat('canonProxyManual', [ to ])
     });
   }
 
-  commandSpecs.forEach(function(commandSpec) {
+  commandSpecs.forEach(commandSpec => {
     var originalName = commandSpec.name;
     if (!commandSpec.isParent) {
-      commandSpec.exec = function(args, context) {
+      commandSpec.exec = (args, context) => {
         context.commandName = originalName;
         return remoter(args, context);
-      }.bind(this);
+      };
     }
 
     if (prefix != null) {
       commandSpec.name = prefix + ' ' + commandSpec.name;
     }
     commandSpec.isProxy = true;
     this.add(commandSpec);
-  }.bind(this));
+  });
 };
 
 /**
  * Remove a set of commands added with addProxyCommands.
  * @param prefix The name prefix that we assign to all command names
  */
 Commands.prototype.removeProxyCommands = function(prefix) {
   var toRemove = [];
-  Object.keys(this._commandSpecs).forEach(function(name) {
+  Object.keys(this._commandSpecs).forEach(name => {
     if (name.indexOf(prefix) === 0) {
       toRemove.push(name);
     }
-  }.bind(this));
+  });
 
   var removed = [];
-  toRemove.forEach(function(name) {
+  toRemove.forEach(name => {
     var command = this.get(name);
     if (command.isProxy) {
       this.remove(name);
       removed.push(name);
     }
     else {
       console.error('Skipping removal of \'' + name +
                     '\' because it is not a proxy command.');
     }
-  }.bind(this));
+  });
 
   return removed;
 };
 
 exports.Commands = Commands;
 
 /**
  * CommandOutputManager stores the output objects generated by executed
--- a/devtools/shared/gcli/source/lib/gcli/commands/help.js
+++ b/devtools/shared/gcli/source/lib/gcli/commands/help.js
@@ -73,19 +73,19 @@ function getHelpManData(commandData, con
         /*
         var val = param.type.stringify(param.defaultValue);
         input = Promise.resolve(val).then(function(defaultValue) {
           return l10n.lookupFormat('helpManDefault', [ defaultValue ]);
         }.bind(this));
         */
       }
 
-      return Promise.resolve(input).then(function(defaultDescr) {
+      return Promise.resolve(input).then(defaultDescr => {
         return '(' + (param.type.name || param.type) + ', ' + defaultDescr + ')';
-      }.bind(this));
+      });
     },
     getSynopsis: function(param) {
       var name = param.name + (param.short ? '|-' + param.short : '');
       if (param.option == null) {
         return param.defaultValue !== undefined ?
             '[' + name + ']' :
             '<' + name + '>';
       }
--- a/devtools/shared/gcli/source/lib/gcli/commands/preflist.js
+++ b/devtools/shared/gcli/source/lib/gcli/commands/preflist.js
@@ -128,23 +128,23 @@ var prefList = {
       description: l10n.lookup('prefListSearchDesc'),
       manual: l10n.lookup('prefListSearchManual')
     }
   ],
   returnType: 'prefsData',
   exec: function(args, context) {
     return new Promise(function(resolve, reject) {
       // This can be slow, get out of the way of the main thread
-      setTimeout(function() {
+      setTimeout(() => {
         var prefsData = {
           settings: context.system.settings.getAll(args.search),
           search: args.search
         };
         resolve(prefsData);
-      }.bind(this), 10);
+      }, 10);
     });
   }
 };
 
 /**
  * A manager for our version of about:config
  */
 function PrefList(prefsData, conversionContext) {
--- a/devtools/shared/gcli/source/lib/gcli/connectors/connectors.js
+++ b/devtools/shared/gcli/source/lib/gcli/connectors/connectors.js
@@ -51,45 +51,45 @@ Connection.prototype.on = function(event
  * Remove an event listener
  */
 Connection.prototype.off = function(event, action) {
   if (!this._listeners) {
     return;
   }
   var actions = this._listeners[event];
   if (actions) {
-    this._listeners[event] = actions.filter(function(li) {
+    this._listeners[event] = actions.filter(li => {
       return li !== action;
-    }.bind(this));
+    });
   }
 };
 
 /**
  * Emit an event. For internal use only
  */
 Connection.prototype._emit = function(event, data) {
   if (this._listeners == null || this._listeners[event] == null) {
     return;
   }
 
   var listeners = this._listeners[event];
-  listeners.forEach(function(listener) {
+  listeners.forEach(listener => {
     // Fail fast if we mutate the list of listeners while emitting
     if (listeners !== this._listeners[event]) {
       throw new Error('Listener list changed while emitting');
     }
 
     try {
       listener.call(null, data);
     }
     catch (ex) {
       console.log('Error calling listeners to ' + event);
       console.error(ex);
     }
-  }.bind(this));
+  });
 };
 
 /**
  * Send a message to the other side of the connection
  */
 Connection.prototype.call = function(feature, data) {
   throw new Error('Not implemented');
 };
@@ -126,19 +126,19 @@ Connectors.prototype.remove = function(c
   var name = typeof connector === 'string' ? connector : connector.name;
   delete this._registered[name];
 };
 
 /**
  * Get access to the list of known connectors
  */
 Connectors.prototype.getAll = function() {
-  return Object.keys(this._registered).map(function(name) {
+  return Object.keys(this._registered).map(name => {
     return this._registered[name];
-  }.bind(this));
+  });
 };
 
 var defaultConnectorName;
 
 /**
  * Get access to a connector by name. If name is undefined then first try to
  * use the same connector that we used last time, and if there was no last
  * time, then just use the first registered connector as a default.
--- a/devtools/shared/gcli/source/lib/gcli/converters/converters.js
+++ b/devtools/shared/gcli/source/lib/gcli/converters/converters.js
@@ -215,19 +215,19 @@ Converters.prototype.get = function(from
   }
   return converter;
 };
 
 /**
  * Get all the registered converters. Most for debugging
  */
 Converters.prototype.getAll = function() {
-  return Object.keys(this._registered.from).map(function(name) {
+  return Object.keys(this._registered.from).map(name => {
     return this._registered.from[name];
-  }.bind(this));
+  });
 };
 
 /**
  * Helper for get to pick the best fallback converter
  */
 Converters.prototype._getFallbackConverter = function(from, to) {
   console.error('No converter from ' + from + ' to ' + to + '. Using fallback');
 
@@ -252,25 +252,25 @@ Converters.prototype._getFallbackConvert
  */
 Converters.prototype.convert = function(data, from, to, conversionContext) {
   try {
     if (from === to) {
       return Promise.resolve(data);
     }
 
     var converter = this.get(from, to);
-    return host.exec(function() {
+    return host.exec(() => {
       return converter.exec(data, conversionContext);
-    }.bind(this));
+    });
   }
   catch (ex) {
     var converter = this.get('error', to);
-    return host.exec(function() {
+    return host.exec(() => {
       return converter.exec(ex, conversionContext);
-    }.bind(this));
+    });
   }
 };
 
 exports.Converters = Converters;
 
 /**
  * Items for export
  */
--- a/devtools/shared/gcli/source/lib/gcli/fields/selection.js
+++ b/devtools/shared/gcli/source/lib/gcli/fields/selection.js
@@ -60,39 +60,39 @@ SelectionField.prototype.destroy = funct
   Field.prototype.destroy.call(this);
 };
 
 SelectionField.prototype.setConversion = function(conversion) {
   this.arg = conversion.arg;
   this.setMessage(conversion.message);
 
   var context = this.requisition.executionContext;
-  conversion.getPredictions(context).then(function(predictions) {
+  conversion.getPredictions(context).then(predictions => {
     var items = predictions.map(function(prediction) {
       // If the prediction value is an 'item' (that is an object with a name and
       // description) then use that, otherwise use the prediction itself, because
       // at least that has a name.
       return prediction.value && prediction.value.description ?
           prediction.value :
           prediction;
     }, this);
     if (this.menu != null) {
       this.menu.show(items, conversion.arg.text);
     }
-  }.bind(this)).catch(util.errorHandler);
+  }).catch(util.errorHandler);
 };
 
 SelectionField.prototype.itemClicked = function(ev) {
   var arg = new Argument(ev.name, '', ' ');
   var context = this.requisition.executionContext;
 
-  this.type.parse(arg, context).then(function(conversion) {
+  this.type.parse(arg, context).then(conversion => {
     this.onFieldChange({ conversion: conversion });
     this.setMessage(conversion.message);
-  }.bind(this)).catch(util.errorHandler);
+  }).catch(util.errorHandler);
 };
 
 SelectionField.prototype.getConversion = function() {
   // This tweaks the prefix/suffix of the argument to fit
   this.arg = this.arg.beget({ text: this.input.value });
   return this.type.parse(this.arg, this.requisition.executionContext);
 };
 
--- a/devtools/shared/gcli/source/lib/gcli/languages/command.js
+++ b/devtools/shared/gcli/source/lib/gcli/languages/command.js
@@ -92,27 +92,27 @@ var commandLanguage = exports.commandLan
 
     // We keep track of which assignment the cursor is in
     this.assignment = this.requisition.getAssignmentAt(0);
 
     if (commandHtmlPromise == null) {
       commandHtmlPromise = host.staticRequire(module, './command.html');
     }
 
-    return commandHtmlPromise.then(function(commandHtml) {
+    return commandHtmlPromise.then(commandHtml => {
       this.commandDom = host.toDom(this.document, commandHtml);
 
       this.requisition.commandOutputManager.onOutput.add(this.outputted, this);
       var mapping = cli.getMapping(this.requisition.executionContext);
       mapping.terminal = this.terminal;
 
       this.requisition.onExternalUpdate.add(this.textChanged, this);
 
       return this;
-    }.bind(this));
+    });
   },
 
   destroy: function() {
     var mapping = cli.getMapping(this.requisition.executionContext);
     delete mapping.terminal;
 
     this.requisition.commandOutputManager.onOutput.remove(this.outputted, this);
     this.requisition.onExternalUpdate.remove(this.textChanged, this);
@@ -244,36 +244,36 @@ var commandLanguage = exports.commandLan
 
   /**
    * See also handleDownArrow for some symmetry
    */
   handleUpArrow: function() {
     // If the user is on a valid value, then we increment the value, but if
     // they've typed something that's not right we page through predictions
     if (this.assignment.getStatus() === Status.VALID) {
-      return this.requisition.nudge(this.assignment, 1).then(function() {
+      return this.requisition.nudge(this.assignment, 1).then(() => {
         this.textChanged();
         this.focusManager.onInputChange();
         return true;
-      }.bind(this));
+      });
     }
 
     return Promise.resolve(false);
   },
 
   /**
    * See also handleUpArrow for some symmetry
    */
   handleDownArrow: function() {
     if (this.assignment.getStatus() === Status.VALID) {
-      return this.requisition.nudge(this.assignment, -1).then(function() {
+      return this.requisition.nudge(this.assignment, -1).then(() => {
         this.textChanged();
         this.focusManager.onInputChange();
         return true;
-      }.bind(this));
+      });
     }
 
     return Promise.resolve(false);
   },
 
   /**
    * RETURN checks status and might exec
    */
@@ -284,20 +284,20 @@ var commandLanguage = exports.commandLan
     }
 
     this.terminal.history.add(input);
     this.terminal.unsetChoice().catch(util.errorHandler);
 
     this.terminal._previousValue = this.terminal.inputElement.value;
     this.terminal.inputElement.value = '';
 
-    return this.requisition.exec().then(function() {
+    return this.requisition.exec().then(() => {
       this.textChanged();
       return true;
-    }.bind(this));
+    });
   },
 
   /**
    * Warning: We get TAB events for more than just the user pressing TAB in our
    * input element.
    */
   handleTab: function() {
     // It's possible for TAB to not change the input, in which case the
@@ -308,40 +308,40 @@ var commandLanguage = exports.commandLan
     this._processCaretChange(inputState);
 
     this.terminal._previousValue = this.terminal.inputElement.value;
 
     // The changes made by complete may happen asynchronously, so after the
     // the call to complete() we should avoid making changes before the end
     // of the event loop
     var index = this.terminal.getChoiceIndex();
-    return this.requisition.complete(inputState.cursor, index).then(function(updated) {
+    return this.requisition.complete(inputState.cursor, index).then(updated => {
       // Abort UI changes if this UI update has been overtaken
       if (!updated) {
         return RESOLVED;
       }
       this.textChanged();
       return this.terminal.unsetChoice();
-    }.bind(this));
+    });
   },
 
   /**
    * The input text has changed in some way.
    */
   handleInput: function(value) {
     this.terminal._caretChange = Caret.NO_CHANGE;
 
-    return this.requisition.update(value).then(function(updated) {
+    return this.requisition.update(value).then(updated => {
       // Abort UI changes if this UI update has been overtaken
       if (!updated) {
         return RESOLVED;
       }
       this.textChanged();
       return this.terminal.unsetChoice();
-    }.bind(this));
+    });
   },
 
   /**
    * Counterpart to |setInput| for moving the cursor.
    * @param cursor A JS object shaped like { start: x, end: y }
    */
   setCursor: function(cursor) {
     this._caretChange = Caret.NO_CHANGE;
@@ -432,19 +432,19 @@ var commandLanguage = exports.commandLan
     });
   },
 
   /**
    * Called by the onFieldChange event (via the terminal) on the current Field
    */
   fieldChanged: function(ev) {
     this.requisition.setAssignment(this.assignment, ev.conversion.arg,
-                                   { matchPadding: true }).then(function() {
+                                   { matchPadding: true }).then(() => {
       this.textChanged();
-    }.bind(this));
+    });
 
     var isError = ev.conversion.message != null && ev.conversion.message !== '';
     this.focusManager.setError(isError);
   },
 
   /**
    * Monitor for new command executions
    */
@@ -468,46 +468,46 @@ var commandLanguage = exports.commandLan
       rowinEle: null,
       rowoutEle: null,
       throbEle: null,
       promptEle: null
     };
 
     domtemplate.template(template, data, templateOptions);
 
-    ev.output.promise.then(function() {
+    ev.output.promise.then(() => {
       var document = data.rowoutEle.ownerDocument;
 
       if (ev.output.completed) {
         data.promptEle.classList.add('gcli-row-complete');
       }
       if (ev.output.error) {
         data.promptEle.classList.add('gcli-row-error');
       }
 
       util.clearElement(data.rowoutEle);
 
-      return ev.output.convert('dom', context).then(function(node) {
+      return ev.output.convert('dom', context).then(node => {
         this.terminal.scrollToBottom();
         data.throbEle.style.display = ev.output.completed ? 'none' : 'block';
 
         if (node == null) {
           data.promptEle.classList.add('gcli-row-error');
           // TODO: show some error to the user
         }
 
         this._linksToNewTab(node);
         data.rowoutEle.appendChild(node);
 
         var event = document.createEvent('Event');
         event.initEvent('load', true, true);
         event.addedElement = node;
         node.dispatchEvent(event);
-      }.bind(this));
-    }.bind(this)).catch(console.error);
+      });
+    }).catch(console.error);
 
     this.terminal.addElement(data.rowinEle);
     this.terminal.addElement(data.rowoutEle);
     this.terminal.scrollToBottom();
 
     this.focusManager.outputted();
   },
 
--- a/devtools/shared/gcli/source/lib/gcli/languages/javascript.js
+++ b/devtools/shared/gcli/source/lib/gcli/languages/javascript.js
@@ -37,17 +37,17 @@ exports.items = [
       this.updateHints();
     },
 
     destroy: function() {
       this.document = undefined;
     },
 
     exec: function(input) {
-      return this.evaluate(input).then(function(response) {
+      return this.evaluate(input).then(response => {
         var output = (response.exception != null) ?
                       response.exception.class :
                       response.output;
 
         var isSameString = typeof output === 'string' &&
                            input.substr(1, input.length - 2) === output;
         var isSameOther = typeof output !== 'string' &&
                           input === '' + output;
@@ -71,16 +71,16 @@ exports.items = [
           line = input + '\n/*\n' + output + '\n*/';
         }
         else {
           line = input + ' // ' + output;
         }
 
         var grammar = prism.languages[this.name];
         return prism.highlight(line, grammar, this.name);
-      }.bind(this));
+      });
     },
 
     evaluate: function(input) {
       return host.script.evaluate(input);
     }
   }
 ];
--- a/devtools/shared/gcli/source/lib/gcli/languages/languages.js
+++ b/devtools/shared/gcli/source/lib/gcli/languages/languages.js
@@ -52,43 +52,43 @@ var baseLanguage = {
   handleTab: function() {
     return this.terminal.unsetChoice().then(function() {
       return RESOLVED;
     }, util.errorHandler);
   },
 
   handleInput: function(input) {
     if (input === ':') {
-      return this.terminal.setInput('').then(function() {
+      return this.terminal.setInput('').then(() => {
         return this.terminal.pushLanguage('commands');
-      }.bind(this));
+      });
     }
 
     return this.terminal.unsetChoice().then(function() {
       return RESOLVED;
     }, util.errorHandler);
   },
 
   handleReturn: function(input) {
     var rowoutEle = this.document.createElement('pre');
     rowoutEle.classList.add('gcli-row-out');
     rowoutEle.classList.add('gcli-row-script');
     rowoutEle.setAttribute('aria-live', 'assertive');
 
-    return this.exec(input).then(function(line) {
+    return this.exec(input).then(line => {
       rowoutEle.innerHTML = line;
 
       this.terminal.addElement(rowoutEle);
       this.terminal.scrollToBottom();
 
       this.focusManager.outputted();
 
       this.terminal.unsetChoice().catch(util.errorHandler);
       this.terminal.inputElement.value = '';
-    }.bind(this));
+    });
   },
 
   setCursor: function(cursor) {
     this.terminal.inputElement.selectionStart = cursor.start;
     this.terminal.inputElement.selectionEnd = cursor.end;
   },
 
   getCompleterTemplateData: function() {
@@ -136,19 +136,19 @@ Languages.prototype.remove = function(la
   var name = typeof language === 'string' ? language : language.name;
   delete this._registered[name];
 };
 
 /**
  * Get access to the list of known languages
  */
 Languages.prototype.getAll = function() {
-  return Object.keys(this._registered).map(function(name) {
+  return Object.keys(this._registered).map(name => {
     return this._registered[name];
-  }.bind(this));
+  });
 };
 
 /**
  * Find a previously registered language
  */
 Languages.prototype.createLanguage = function(name, terminal) {
   if (name == null) {
     name = Object.keys(this._registered)[0];
--- a/devtools/shared/gcli/source/lib/gcli/mozui/completer.js
+++ b/devtools/shared/gcli/source/lib/gcli/mozui/completer.js
@@ -106,29 +106,29 @@ Completer.prototype.resized = function(e
 };
 
 /**
  * Bring the completion element up to date with what the requisition says
  */
 Completer.prototype.update = function(ev) {
   this.choice = (ev && ev.choice != null) ? ev.choice : 0;
 
-  this._getCompleterTemplateData().then(function(data) {
+  this._getCompleterTemplateData().then(data => {
     if (this.template == null) {
       return; // destroy() has been called
     }
 
     var template = this.template.cloneNode(true);
     domtemplate.template(template, data, { stack: 'completer.html' });
 
     util.clearElement(this.element);
     while (template.hasChildNodes()) {
       this.element.appendChild(template.firstChild);
     }
-  }.bind(this));
+  });
 };
 
 /**
  * Calculate the properties required by the template process for completer.html
  */
 Completer.prototype._getCompleterTemplateData = function() {
   var input = this.inputter.getInputState();
   var start = input.cursor.start;
--- a/devtools/shared/gcli/source/lib/gcli/mozui/inputter.js
+++ b/devtools/shared/gcli/source/lib/gcli/mozui/inputter.js
@@ -357,20 +357,20 @@ Inputter.prototype._checkAssignment = fu
  * input. It does not make any similarity checks so calling this function with
  * it's current value resets the cursor position.
  * It does not execute the input or affect the history.
  * This function should not be called internally, by Inputter and never as a
  * result of a keyboard event on this.element or bug 676520 could be triggered.
  */
 Inputter.prototype.setInput = function(str) {
   this._caretChange = Caret.TO_END;
-  return this.requisition.update(str).then(function(updated) {
+  return this.requisition.update(str).then(updated => {
     this.textChanged();
     return updated;
-  }.bind(this));
+  });
 };
 
 /**
  * Counterpart to |setInput| for moving the cursor.
  * @param cursor An object shaped like { start: x, end: y }
  */
 Inputter.prototype.setCursor = function(cursor) {
   this._caretChange = Caret.NO_CHANGE;
@@ -474,53 +474,53 @@ Inputter.prototype.handleKeyUp = functio
   }
 
   this._scrollingThroughHistory = false;
   this._caretChange = Caret.NO_CHANGE;
 
   this._completed = this.requisition.update(this.element.value);
   this._previousValue = this.element.value;
 
-  return this._completed.then(function() {
+  return this._completed.then(() => {
     // Abort UI changes if this UI update has been overtaken
     if (this._previousValue === this.element.value) {
       this._choice = null;
       this.textChanged();
       this.onChoiceChange({ choice: this._choice });
     }
-  }.bind(this));
+  });
 };
 
 /**
  * See also _handleDownArrow for some symmetry
  */
 Inputter.prototype._handleUpArrow = function() {
   if (this.tooltip && this.tooltip.isMenuShowing) {
     this.changeChoice(-1);
     return RESOLVED;
   }
 
   if (this.element.value === '' || this._scrollingThroughHistory) {
     this._scrollingThroughHistory = true;
-    return this.requisition.update(this.history.backward()).then(function(updated) {
+    return this.requisition.update(this.history.backward()).then(updated => {
       this.textChanged();
       return updated;
-    }.bind(this));
+    });
   }
 
   // If the user is on a valid value, then we increment the value, but if
   // they've typed something that's not right we page through predictions
   if (this.assignment.getStatus() === Status.VALID) {
-    return this.requisition.nudge(this.assignment, 1).then(function() {
+    return this.requisition.nudge(this.assignment, 1).then(() => {
       // See notes on focusManager.onInputChange in onKeyDown
       this.textChanged();
       if (this.focusManager) {
         this.focusManager.onInputChange();
       }
-    }.bind(this));
+    });
   }
 
   this.changeChoice(-1);
   return RESOLVED;
 };
 
 /**
  * See also _handleUpArrow for some symmetry
@@ -528,31 +528,31 @@ Inputter.prototype._handleUpArrow = func
 Inputter.prototype._handleDownArrow = function() {
   if (this.tooltip && this.tooltip.isMenuShowing) {
     this.changeChoice(+1);
     return RESOLVED;
   }
 
   if (this.element.value === '' || this._scrollingThroughHistory) {
     this._scrollingThroughHistory = true;
-    return this.requisition.update(this.history.forward()).then(function(updated) {
+    return this.requisition.update(this.history.forward()).then(updated => {
       this.textChanged();
       return updated;
-    }.bind(this));
+    });
   }
 
   // See notes above for the UP key
   if (this.assignment.getStatus() === Status.VALID) {
-    return this.requisition.nudge(this.assignment, -1).then(function() {
+    return this.requisition.nudge(this.assignment, -1).then(() => {
       // See notes on focusManager.onInputChange in onKeyDown
       this.textChanged();
       if (this.focusManager) {
         this.focusManager.onInputChange();
       }
-    }.bind(this));
+    });
   }
 
   this.changeChoice(+1);
   return RESOLVED;
 };
 
 /**
  * RETURN checks status and might exec
@@ -561,19 +561,19 @@ Inputter.prototype._handleReturn = funct
   // Deny RETURN unless the command might work
   if (this.requisition.status === Status.VALID) {
     this._scrollingThroughHistory = false;
     this.history.add(this.element.value);
 
     let name = this.requisition.commandAssignment.value.name;
     this._telemetry.logKeyed("DEVTOOLS_GCLI_COMMANDS_KEYED", name);
 
-    return this.requisition.exec().then(function() {
+    return this.requisition.exec().then(() => {
       this.textChanged();
-    }.bind(this));
+    });
   }
 
   // If we can't execute the command, but there is a menu choice to use
   // then use it.
   if (!this.tooltip.selectChoice()) {
     this.focusManager.setError(true);
   }
 
@@ -612,24 +612,24 @@ Inputter.prototype._handleTab = function
     // of the event loop
     this._completed = this.requisition.complete(inputState.cursor,
                                                 this._choice);
     this._previousValue = this.element.value;
   }
   this.lastTabDownAt = 0;
   this._scrollingThroughHistory = false;
 
-  return this._completed.then(function(updated) {
+  return this._completed.then(updated => {
     // Abort UI changes if this UI update has been overtaken
     if (updated) {
       this.textChanged();
       this._choice = null;
       this.onChoiceChange({ choice: this._choice });
     }
-  }.bind(this));
+  });
 };
 
 /**
  * Used by onKeyUp for UP/DOWN to change the current choice from an options
  * menu.
  */
 Inputter.prototype.changeChoice = function(amount) {
   if (this._choice == null) {
--- a/devtools/shared/gcli/source/lib/gcli/mozui/tooltip.js
+++ b/devtools/shared/gcli/source/lib/gcli/mozui/tooltip.js
@@ -165,20 +165,20 @@ Tooltip.prototype.assignmentChanged = fu
 
 /**
  * Forward the event to the current field
  */
 Tooltip.prototype.choiceChanged = function(ev) {
   if (this.field && this.field.menu) {
     var conversion = this.assignment.conversion;
     var context = this.requisition.executionContext;
-    conversion.constrainPredictionIndex(context, ev.choice).then(function(choice) {
+    conversion.constrainPredictionIndex(context, ev.choice).then(choice => {
       this.field.menu._choice = choice;
       this.field.menu._updateHighlight();
-    }.bind(this)).catch(util.errorHandler);
+    }).catch(util.errorHandler);
   }
 };
 
 /**
  * Allow the inputter to use RETURN to chose the current menu item when
  * it can't execute the command line
  * @return true if there was a selection to use, false otherwise
  */
@@ -197,19 +197,19 @@ Tooltip.prototype.fieldChanged = functio
                                  { matchPadding: true });
 
   var isError = ev.conversion.message != null && ev.conversion.message !== '';
   this.focusManager.setError(isError);
 
   // Nasty hack, the inputter won't know about the text change yet, so it will
   // get it's calculations wrong. We need to wait until the current set of
   // changes has had a chance to propagate
-  this.document.defaultView.setTimeout(function() {
+  this.document.defaultView.setTimeout(() => {
     this.inputter.focus();
-  }.bind(this), 10);
+  }, 10);
 };
 
 /**
  * Called by the Inputter when the text changes
  */
 Tooltip.prototype.textChanged = function() {
   // We get here for minor things like whitespace change in arg prefix,
   // so we ignore anything but an actual value change.
--- a/devtools/shared/gcli/source/lib/gcli/settings.js
+++ b/devtools/shared/gcli/source/lib/gcli/settings.js
@@ -70,43 +70,43 @@ function Settings(types, settingValues) 
  * Load system prefs if they've not been loaded already
  * @return true
  */
 Settings.prototype._readSystem = function() {
   if (this._hasReadSystem) {
     return;
   }
 
-  imports.prefBranch.getChildList('').forEach(function(name) {
+  imports.prefBranch.getChildList('').forEach(name => {
     var setting = new Setting(this, name);
     this._settingsAll.push(setting);
     this._settingsMap.set(name, setting);
-  }.bind(this));
+  });
 
-  this._settingsAll.sort(function(s1, s2) {
+  this._settingsAll.sort((s1, s2) => {
     return s1.name.localeCompare(s2.name);
-  }.bind(this));
+  });
 
   this._hasReadSystem = true;
 };
 
 /**
  * Get an array containing all known Settings filtered to match the given
  * filter (string) at any point in the name of the setting
  */
 Settings.prototype.getAll = function(filter) {
   this._readSystem();
 
   if (filter == null) {
     return this._settingsAll;
   }
 
-  return this._settingsAll.filter(function(setting) {
+  return this._settingsAll.filter(setting => {
     return setting.name.indexOf(filter) !== -1;
-  }.bind(this));
+  });
 };
 
 /**
  * Add a new setting
  */
 Settings.prototype.add = function(prefSpec) {
   var setting = new Setting(this, prefSpec);
 
--- a/devtools/shared/gcli/source/lib/gcli/system.js
+++ b/devtools/shared/gcli/source/lib/gcli/system.js
@@ -174,19 +174,19 @@ exports.createSystem = function(options)
           promises.push(loadModule(name).catch(console.error));
         }
       });
 
       if (options.delayedLoad) {
         return Promise.resolve();
       }
       else {
-        return Promise.all(promises).then(function() {
+        return Promise.all(promises).then(() => {
           this.commands.onCommandsChange.resumeFire();
-        }.bind(this));
+        });
       }
     },
 
     removeItemsByModule: function(name) {
       this.commands.onCommandsChange.holdFire();
 
       delete loadableModules[name];
       unloadModule(name);
@@ -208,19 +208,19 @@ exports.createSystem = function(options)
       var promises = Object.keys(loadableModules).map(function(name) {
         delete modules[name];
         return loadModule(name).catch(console.error);
       });
 
       Object.keys(modules).forEach(unloadModule);
       pendingChanges = false;
 
-      return Promise.all(promises).then(function() {
+      return Promise.all(promises).then(() => {
         this.commands.onCommandsChange.resumeFire();
-      }.bind(this));
+      });
     },
 
     destroy: function() {
       this.commands.onCommandsChange.holdFire();
 
       Object.keys(loadedModules).forEach(function(name) {
         unloadModule(name);
       });
--- a/devtools/shared/gcli/source/lib/gcli/types/array.js
+++ b/devtools/shared/gcli/source/lib/gcli/types/array.js
@@ -55,22 +55,22 @@ exports.items = [
         console.error('non ArrayArgument to ArrayType.parse', arg);
         throw new Error('non ArrayArgument to ArrayType.parse');
       }
 
       // Parse an argument to a conversion
       // Hack alert. ArrayConversion needs to be able to answer questions about
       // the status of individual conversions in addition to the overall state.
       // |subArg.conversion| allows us to do that easily.
-      var subArgParse = function(subArg) {
-        return this.subtype.parse(subArg, context).then(function(conversion) {
+      var subArgParse = subArg => {
+        return this.subtype.parse(subArg, context).then(conversion => {
           subArg.conversion = conversion;
           return conversion;
-        }.bind(this));
-      }.bind(this);
+        });
+      };
 
       var conversionPromises = arg.getArguments().map(subArgParse);
       return Promise.all(conversionPromises).then(function(conversions) {
         return new ArrayConversion(conversions, arg);
       });
     },
 
     getBlank: function(context) {
--- a/devtools/shared/gcli/source/lib/gcli/types/delegate.js
+++ b/devtools/shared/gcli/source/lib/gcli/types/delegate.js
@@ -37,33 +37,33 @@ exports.items = [
     },
 
     // Child types should implement this method to return an instance of the type
     // that should be used. If no type is available, or some sort of temporary
     // placeholder is required, BlankType can be used.
     delegateType: undefined,
 
     stringify: function(value, context) {
-      return this.getType(context).then(function(delegated) {
+      return this.getType(context).then(delegated => {
         return delegated.stringify(value, context);
-      }.bind(this));
+      });
     },
 
     parse: function(arg, context) {
-      return this.getType(context).then(function(delegated) {
+      return this.getType(context).then(delegated => {
         return delegated.parse(arg, context);
-      }.bind(this));
+      });
     },
 
     nudge: function(value, by, context) {
-      return this.getType(context).then(function(delegated) {
+      return this.getType(context).then(delegated => {
         return delegated.nudge ?
                delegated.nudge(value, by, context) :
                undefined;
-      }.bind(this));
+      });
     },
 
     getType: function(context) {
       if (this.delegateType === undefined) {
         return Promise.resolve(this.types.createType('blank'));
       }
 
       var type = this.delegateType(context);
@@ -120,26 +120,26 @@ exports.items = [
       // asked to stringify that. We can stringify fake value objects.
       if (typeof value.stringified === 'string') {
         return value.stringified;
       }
       throw new Error('Can\'t stringify that value');
     },
 
     parse: function(arg, context) {
-      return this.front.parseType(context.typed, this.paramName).then(function(json) {
+      return this.front.parseType(context.typed, this.paramName).then(json => {
         var status = Status.fromString(json.status);
         return new Conversion(undefined, arg, status, json.message, json.predictions);
-      }.bind(this));
+      });
     },
 
     nudge: function(value, by, context) {
-      return this.front.nudgeType(context.typed, by, this.paramName).then(function(json) {
+      return this.front.nudgeType(context.typed, by, this.paramName).then(json => {
         return { stringified: json.arg };
-      }.bind(this));
+      });
     }
   },
   // 'blank' is a type for use with DelegateType when we don't know yet.
   // It should not be used anywhere else.
   {
     item: 'type',
     name: 'blank',
 
--- a/devtools/shared/gcli/source/lib/gcli/types/resource.js
+++ b/devtools/shared/gcli/source/lib/gcli/types/resource.js
@@ -59,19 +59,19 @@ function CssResource(domSheet) {
   this.inline = (domSheet.href == null);
   this.type = Resource.TYPE_CSS;
   this.element = domSheet;
 }
 
 CssResource.prototype = Object.create(Resource.prototype);
 
 CssResource.prototype.loadContents = function() {
-  return new Promise(function(resolve, reject) {
+  return new Promise((resolve, reject) => {
     resolve(this.element.ownerNode.innerHTML);
-  }.bind(this));
+  });
 };
 
 CssResource._getAllStyles = function(context) {
   var resources = [];
   if (context.environment.window == null) {
     return resources;
   }
 
@@ -125,33 +125,33 @@ function ScriptResource(scriptNode) {
   this.inline = (scriptNode.src === '' || scriptNode.src == null);
   this.type = Resource.TYPE_SCRIPT;
   this.element = scriptNode;
 }
 
 ScriptResource.prototype = Object.create(Resource.prototype);
 
 ScriptResource.prototype.loadContents = function() {
-  return new Promise(function(resolve, reject) {
+  return new Promise((resolve, reject) => {
     if (this.inline) {
       resolve(this.element.innerHTML);
     }
     else {
       // It would be good if there was a better way to get the script source
       var xhr = new XMLHttpRequest();
       xhr.onreadystatechange = function() {
         if (xhr.readyState !== xhr.DONE) {
           return;
         }
         resolve(xhr.responseText);
       };
       xhr.open('GET', this.element.src, true);
       xhr.send();
     }
-  }.bind(this));
+  });
 };
 
 ScriptResource._getAllScripts = function(context) {
   if (context.environment.window == null) {
     return [];
   }
 
   var doc = context.environment.window.document;
--- a/devtools/shared/gcli/source/lib/gcli/types/selection.js
+++ b/devtools/shared/gcli/source/lib/gcli/types/selection.js
@@ -85,27 +85,27 @@ SelectionType.prototype.getSpec = functi
 SelectionType.prototype.stringify = function(value, context) {
   if (value == null) {
     return '';
   }
   if (this.stringifyProperty != null) {
     return value[this.stringifyProperty];
   }
 
-  return this.getLookup(context).then(function(lookup) {
+  return this.getLookup(context).then(lookup => {
     var name = null;
     lookup.some(function(item) {
       if (item.value === value) {
         name = item.name;
         return true;
       }
       return false;
     }, this);
     return name;
-  }.bind(this));
+  });
 };
 
 /**
  * If typeSpec contained cacheable:true then calls to parse() work on cached
  * data. clearCache() enables the cache to be cleared.
  */
 SelectionType.prototype.clearCache = function() {
   this._cachedLookup = undefined;
@@ -260,20 +260,20 @@ exports.findPredictions = function(arg, 
       }, this);
     }
   }
 
   return predictions;
 };
 
 SelectionType.prototype.parse = function(arg, context) {
-  return Promise.resolve(this.getLookup(context)).then(function(lookup) {
+  return Promise.resolve(this.getLookup(context)).then(lookup => {
     var predictions = exports.findPredictions(arg, lookup);
     return exports.convertPredictions(arg, predictions);
-  }.bind(this));
+  });
 };
 
 /**
  * Decide what sort of conversion to return based on the available predictions
  * and how they match the passed arg
  */
 exports.convertPredictions = function(arg, predictions) {
   if (predictions.length === 0) {
@@ -298,23 +298,23 @@ exports.convertPredictions = function(ar
  * that on the option, so this encapsulates the problem
  */
 function isHidden(option) {
   return option.hidden === true ||
          (option.value != null && option.value.hidden);
 }
 
 SelectionType.prototype.getBlank = function(context) {
-  var predictFunc = function(context2) {
+  var predictFunc = context2 => {
     return Promise.resolve(this.getLookup(context2)).then(function(lookup) {
       return lookup.filter(function(option) {
         return !isHidden(option);
       }).slice(0, Conversion.maxPredictions - 1);
     });
-  }.bind(this);
+  };
 
   return new Conversion(undefined, new BlankArgument(), Status.INCOMPLETE, '',
                         predictFunc);
 };
 
 /**
  * Increment and decrement are confusing for selections. +1 is -1 and -1 is +1.
  * Given an array e.g. [ 'a', 'b', 'c' ] with the current selection on 'b',
@@ -325,17 +325,17 @@ SelectionType.prototype.getBlank = funct
  *   'c'
  *
  * Pressing the UP arrow should take us to 'a', which decrements this index
  * (compare pressing UP on a number which would increment the number)
  *
  * So for selections, we treat +1 as -1 and -1 as +1.
  */
 SelectionType.prototype.nudge = function(value, by, context) {
-  return this.getLookup(context).then(function(lookup) {
+  return this.getLookup(context).then(lookup => {
     var index = this._findValue(lookup, value);
     if (index === -1) {
       if (by < 0) {
         // We're supposed to be doing a decrement (which means +1), but the
         // value isn't found, so we reset the index to the top of the list
         // which is index 0
         index = 0;
       }
@@ -349,17 +349,17 @@ SelectionType.prototype.nudge = function
 
     // This is where we invert the sense of up/down (see doc comment)
     index -= by;
 
     if (index >= lookup.length) {
       index = 0;
     }
     return lookup[index].value;
-  }.bind(this));
+  });
 };
 
 /**
  * Walk through an array of { name:.., value:... } objects looking for a
  * matching value (using strict equality), returning the matched index (or -1
  * if not found).
  * @param lookup Array of objects with name/value properties to search through
  * @param value The value to search for
--- a/devtools/shared/gcli/source/lib/gcli/types/types.js
+++ b/devtools/shared/gcli/source/lib/gcli/types/types.js
@@ -822,27 +822,27 @@ Conversion.prototype.getPredictions = fu
  * This code can probably be removed when the Firefox developer toolbar isn't
  * needed any more.
  */
 Conversion.prototype.constrainPredictionIndex = function(context, index) {
   if (index == null) {
     return Promise.resolve();
   }
 
-  return this.getPredictions(context).then(function(value) {
+  return this.getPredictions(context).then(value => {
     if (value.length === 0) {
       return undefined;
     }
 
     index = index % value.length;
     if (index < 0) {
       index = value.length + index;
     }
     return index;
-  }.bind(this));
+  });
 };
 
 /**
  * Constant to allow everyone to agree on the maximum number of predictions
  * that should be provided. We actually display 1 less than this number.
  */
 Conversion.maxPredictions = 9;
 
--- a/devtools/shared/gcli/source/lib/gcli/types/union.js
+++ b/devtools/shared/gcli/source/lib/gcli/types/union.js
@@ -25,58 +25,58 @@ exports.items = [
     // The union type allows for a combination of different parameter types.
     item: 'type',
     name: 'union',
     hasPredictions: true,
 
     constructor: function() {
       // Get the properties of the type. Later types in the list should always
       // be more general, so 'catch all' types like string must be last
-      this.alternatives = this.alternatives.map(function(typeData) {
+      this.alternatives = this.alternatives.map(typeData => {
         return this.types.createType(typeData);
-      }.bind(this));
+      });
     },
 
     getSpec: function(command, param) {
       var spec = { name: 'union', alternatives: [] };
-      this.alternatives.forEach(function(type) {
+      this.alternatives.forEach(type => {
         spec.alternatives.push(type.getSpec(command, param));
-      }.bind(this));
+      });
       return spec;
     },
 
     stringify: function(value, context) {
       if (value == null) {
         return '';
       }
 
       var type = this.alternatives.find(function(typeData) {
         return typeData.name === value.type;
       });
 
       return type.stringify(value[value.type], context);
     },
 
     parse: function(arg, context) {
-      var conversionPromises = this.alternatives.map(function(type) {
+      var conversionPromises = this.alternatives.map(type => {
         return type.parse(arg, context);
-      }.bind(this));
+      });
 
-      return Promise.all(conversionPromises).then(function(conversions) {
+      return Promise.all(conversionPromises).then(conversions => {
         // Find a list of the predictions made by any conversion
-        var predictionPromises = conversions.map(function(conversion) {
+        var predictionPromises = conversions.map(conversion => {
           return conversion.getPredictions(context);
-        }.bind(this));
+        });
 
-        return Promise.all(predictionPromises).then(function(allPredictions) {
+        return Promise.all(predictionPromises).then(allPredictions => {
           // Take one prediction from each set of predictions, ignoring
           // duplicates, until we've got up to Conversion.maxPredictions
-          var maxIndex = allPredictions.reduce(function(prev, prediction) {
+          var maxIndex = allPredictions.reduce((prev, prediction) => {
             return Math.max(prev, prediction.length);
-          }.bind(this), 0);
+          }, 0);
           var predictions = [];
 
           indexLoop:
           for (var index = 0; index < maxIndex; index++) {
             for (var p = 0; p <= allPredictions.length; p++) {
               if (predictions.length >= Conversion.maxPredictions) {
                 break indexLoop;
               }
@@ -105,13 +105,13 @@ exports.items = [
               break;
             }
           }
 
           var msg = (bestStatus === Status.VALID) ?
                     '' :
                     l10n.lookupFormat('typesSelectionNomatch', [ arg.text ]);
           return new Conversion(value, arg, bestStatus, msg, predictions);
-        }.bind(this));
-      }.bind(this));
+        });
+      });
     },
   }
 ];
--- a/devtools/shared/gcli/source/lib/gcli/types/url.js
+++ b/devtools/shared/gcli/source/lib/gcli/types/url.js
@@ -44,25 +44,25 @@ exports.items = [
         conversion = new Conversion(url, arg);
       }
       catch (ex) {
         var predictions = [];
         var status = Status.ERROR;
 
         // Maybe the URL was missing a scheme?
         if (arg.text.indexOf('://') === -1) {
-          [ 'http', 'https' ].forEach(function(scheme) {
+          [ 'http', 'https' ].forEach(scheme => {
             try {
               var http = host.createUrl(scheme + '://' + arg.text);
               predictions.push({ name: http.href, value: http });
             }
             catch (ex) {
               // Ignore
             }
-          }.bind(this));
+          });
 
           // Try to create a URL with the current page as a base ref
           if ('window' in context.environment) {
             try {
               var base = context.environment.window.location.href;
               var localized = host.createUrl(arg.text, base);
               predictions.push({ name: localized.href, value: localized });
             }
--- a/devtools/shared/gcli/source/lib/gcli/ui/focus.js
+++ b/devtools/shared/gcli/source/lib/gcli/ui/focus.js
@@ -130,18 +130,18 @@ FocusManager.prototype.destroy = functio
 FocusManager.prototype.addMonitoredElement = function(element, where) {
   if (this.debug) {
     console.log('FocusManager.addMonitoredElement(' + (where || 'unknown') + ')');
   }
 
   var monitor = {
     element: element,
     where: where,
-    onFocus: function() { this._reportFocus(where); }.bind(this),
-    onBlur: function() { this._reportBlur(where); }.bind(this)
+    onFocus: () => { this._reportFocus(where); },
+    onBlur: () => { this._reportBlur(where); }
   };
 
   element.addEventListener('focus', monitor.onFocus, true);
   element.addEventListener('blur', monitor.onBlur, true);
 
   if (this.document.activeElement === element) {
     this._reportFocus(where);
   }
@@ -236,24 +236,24 @@ FocusManager.prototype._reportBlur = fun
   if (this._hasFocus) {
     if (this._blurDelayTimeout) {
       if (this.debug) {
         console.log('FocusManager.blurPending');
       }
       return;
     }
 
-    this._blurDelayTimeout = this.window.setTimeout(function() {
+    this._blurDelayTimeout = this.window.setTimeout(() => {
       if (this.debug) {
         console.log('FocusManager.blur');
       }
       this._hasFocus = false;
       this._checkShow();
       this._blurDelayTimeout = null;
-    }.bind(this), this.blurDelay);
+    }, this.blurDelay);
   }
 };
 
 /**
  * The setting has changed
  */
 FocusManager.prototype._eagerHelperChanged = function() {
   this._checkShow();
--- a/devtools/shared/gcli/source/lib/gcli/ui/menu.js
+++ b/devtools/shared/gcli/source/lib/gcli/ui/menu.js
@@ -50,34 +50,34 @@ function Menu(options) {
   }
 
   this.element =  util.createElement(this.document, 'div');
   this.element.classList.add('gcli-menu');
 
   if (menuCssPromise == null) {
     menuCssPromise = host.staticRequire(module, './menu.css');
   }
-  menuCssPromise.then(function(menuCss) {
+  menuCssPromise.then(menuCss => {
     // Pull the HTML into the DOM, but don't add it to the document
     if (menuCss != null) {
       util.importCss(menuCss, this.document, 'gcli-menu');
     }
-  }.bind(this), console.error);
+  }, console.error);
 
   this.templateOptions = { blankNullUndefined: true, stack: 'menu.html' };
   if (menuHtmlPromise == null) {
     menuHtmlPromise = host.staticRequire(module, './menu.html');
   }
-  menuHtmlPromise.then(function(menuHtml) {
+  menuHtmlPromise.then(menuHtml => {
     if (this.document == null) {
       return; // destroy() has been called
     }
 
     this.template = host.toDom(this.document, menuHtml);
-  }.bind(this), console.error);
+  }, console.error);
 
   // Contains the items that should be displayed
   this.items = [];
 
   this.onItemClick = util.createEvent('Menu.onItemClick');
 }
 
 /**
@@ -147,23 +147,23 @@ Object.defineProperty(Menu.prototype, 's
  * @param match Matching text to highlight in the output
  */
 Menu.prototype.show = function(items, match) {
   // If the HTML hasn't loaded yet then just don't show a menu
   if (this.template == null) {
     return;
   }
 
-  this.items = items.filter(function(item) {
+  this.items = items.filter(item => {
     return item.hidden === undefined || item.hidden !== true;
-  }.bind(this));
+  });
 
-  this.items = this.items.map(function(item) {
+  this.items = this.items.map(item => {
     return getHighlightingProxy(item, match, this.template.ownerDocument);
-  }.bind(this));
+  });
 
   if (this.items.length === 0) {
     this.element.style.display = 'none';
     return;
   }
 
   if (this.items.length >= this.maxPredictions) {
     this.items.splice(-1);
--- a/devtools/shared/gcli/source/lib/gcli/util/host.js
+++ b/devtools/shared/gcli/source/lib/gcli/util/host.js
@@ -100,35 +100,35 @@ var resourceDirName = function(path) {
  * Asynchronously load a text resource
  * @see lib/gcli/util/host.js
  */
 exports.staticRequire = function(requistingModule, name) {
   if (name.match(/\.css$/)) {
     return Promise.resolve('');
   }
   else {
-    return new Promise(function(resolve, reject) {
+    return new Promise((resolve, reject) => {
       var filename = resourceDirName(requistingModule.id) + '/' + name;
       filename = filename.replace(/\/\.\//g, '/');
       filename = 'resource://devtools/shared/gcli/source/lib/' + filename;
 
       var xhr = Cc['@mozilla.org/xmlextras/xmlhttprequest;1']
                   .createInstance(Ci.nsIXMLHttpRequest);
 
-      xhr.onload = function onload() {
+      xhr.onload = () => {
         resolve(xhr.responseText);
-      }.bind(this);
+      };
 
-      xhr.onabort = xhr.onerror = xhr.ontimeout = function(err) {
+      xhr.onabort = xhr.onerror = xhr.ontimeout = err => {
         reject(err);
-      }.bind(this);
+      };
 
       xhr.open('GET', filename);
       xhr.send();
-    }.bind(this));
+    });
   }
 };
 
 /**
  * A group of functions to help scripting. Small enough that it doesn't need
  * a separate module (it's basically a wrapper around 'eval' in some contexts)
  */
 var client;
@@ -147,17 +147,17 @@ exports.script.useTarget = function(tgt)
   target = tgt;
 
   // Local debugging needs to make the target remote.
   var targetPromise = target.isRemote ?
                       Promise.resolve(target) :
                       target.makeRemote();
 
   return targetPromise.then(function() {
-    return new Promise(function(resolve, reject) {
+    return new Promise((resolve, reject) => {
       client = target._client;
 
       client.addListener('pageError', function(packet) {
         if (packet.from === consoleActor) {
           // console.log('pageError', packet.pageError);
           exports.script.onOutput({
             level: 'exception',
             message: packet.exception.class
@@ -198,33 +198,33 @@ exports.script.useTarget = function(tgt)
           resolve(response);
         }
 
         // TODO: add _onTabNavigated code?
       };
 
       var listeners = [ 'PageError', 'ConsoleAPI' ];
       client.attachConsole(consoleActor, listeners, onAttach);
-    }.bind(this));
+    });
   });
 };
 
 /**
  * Execute some JavaScript
  */
 exports.script.evaluate = function(javascript) {
-  return new Promise(function(resolve, reject) {
+  return new Promise((resolve, reject) => {
     var onResult = function(response) {
       var output = response.result;
       if (typeof output === 'object' && output.type === 'undefined') {
         output = undefined;
       }
 
       resolve({
         input: response.input,
         output: output,
         exception: response.exception
       });
     };
 
     webConsoleClient.evaluateJS(javascript, onResult, {});
-  }.bind(this));
+  });
 };
--- a/devtools/shared/pretty-fast/pretty-fast.js
+++ b/devtools/shared/pretty-fast/pretty-fast.js
@@ -9,17 +9,17 @@
 
   if (typeof define === "function" && define.amd) {
     define(factory);
   } else if (typeof exports === "object") {
     module.exports = factory();
   } else {
     root.prettyFast = factory();
   }
-}(this, function () {
+}(this, () => {
   "use strict";
 
   var acorn = this.acorn || require("acorn/acorn");
   var sourceMap = this.sourceMap || require("source-map");
   var SourceNode = sourceMap.SourceNode;
 
   // If any of these tokens are seen before a "[" token, we know that "[" token
   // is the start of an array literal, rather than a property access.
@@ -865,9 +865,9 @@
       lastToken.type = token.type;
       lastToken.value = token.value;
       lastToken.isArrayLiteral = token.isArrayLiteral;
     }
 
     return result.toStringWithSourceMap({ file: options.url });
   };
 
-}.bind(this)));
+}));
--- a/devtools/shared/touch/simulator-core.js
+++ b/devtools/shared/touch/simulator-core.js
@@ -234,20 +234,20 @@ SimulatorCore.prototype = {
       cancelable: true,
       view,
       screenX,
       screenY,
       clientX,
       clientY,
     });
     let content = this.getContent(target);
-    let timeout = content.setTimeout((function contextMenu() {
+    let timeout = content.setTimeout(() => {
       target.dispatchEvent(evt);
       this.cancelClick = true;
-    }).bind(this), delay);
+    }, delay);
 
     return timeout;
   },
 
   sendTouchEvent(evt, target, name) {
     function clone(obj) {
       return Cu.cloneInto(obj, target);
     }
--- a/dom/animation/test/css-animations/file_event-dispatch.html
+++ b/dom/animation/test/css-animations/file_event-dispatch.html
@@ -16,28 +16,28 @@
 /**
  * Helper class to record the elapsedTime member of each event.
  * The EventWatcher class in testharness.js allows us to wait on
  * multiple events in a certain order but only records the event
  * parameters of the most recent event.
  */
 function AnimationEventHandler(target) {
   this.target = target;
-  this.target.onanimationstart = function(evt) {
+  this.target.onanimationstart = evt => {
    this.animationstart = evt.elapsedTime;
-  }.bind(this);
-  this.target.onanimationiteration = function(evt) {
+  };
+  this.target.onanimationiteration = evt => {
     this.animationiteration = evt.elapsedTime;
-  }.bind(this);
-  this.target.onanimationend = function(evt) {
+  };
+  this.target.onanimationend = evt => {
     this.animationend = evt.elapsedTime;
-  }.bind(this);
-  this.target.onanimationcancel = function(evt) {
+  };
+  this.target.onanimationcancel = evt => {
     this.animationcancel = evt.elapsedTime;
-  }.bind(this);
+  };
 }
 AnimationEventHandler.prototype.clear = function() {
   this.animationstart     = undefined;
   this.animationiteration = undefined;
   this.animationend       = undefined;
   this.animationcancel    = undefined;
 }
 
--- a/dom/animation/test/css-animations/file_event-order.html
+++ b/dom/animation/test/css-animations/file_event-order.html
@@ -38,21 +38,21 @@ events (${expectedEvents.map(event => ev
 
 function setupAnimation(t, animationStyle, receiveEvents) {
   const div = addDiv(t, { style: "animation: " + animationStyle });
   const watcher = new EventWatcher(t, div, [ 'animationstart',
                                              'animationiteration',
                                              'animationend' ]);
 
   ['start', 'iteration', 'end'].forEach(name => {
-    div['onanimation' + name] = function(evt) {
+    div['onanimation' + name] = evt => {
     receiveEvents.push({ type:        evt.type,
                          target:      evt.target,
                          elapsedTime: evt.elapsedTime });
-    }.bind(this);
+    };
   });
 
   const animation = div.getAnimations()[0];
 
   return [animation, watcher, div];
 }
 
 promise_test(function(t) {
--- a/dom/animation/test/css-transitions/file_event-dispatch.html
+++ b/dom/animation/test/css-transitions/file_event-dispatch.html
@@ -10,28 +10,28 @@
 /**
  * Helper class to record the elapsedTime member of each event.
  * The EventWatcher class in testharness.js allows us to wait on
  * multiple events in a certain order but only records the event
  * parameters of the most recent event.
  */
 function TransitionEventHandler(target) {
   this.target = target;
-  this.target.ontransitionrun = function(evt) {
+  this.target.ontransitionrun = evt => {
     this.transitionrun = evt.elapsedTime;
-  }.bind(this);
-  this.target.ontransitionstart = function(evt) {
+  };
+  this.target.ontransitionstart = evt => {
     this.transitionstart = evt.elapsedTime;
-  }.bind(this);
-  this.target.ontransitionend = function(evt) {
+  };
+  this.target.ontransitionend = evt => {
     this.transitionend = evt.elapsedTime;
-  }.bind(this);
-  this.target.ontransitioncancel = function(evt) {
+  };
+  this.target.ontransitioncancel = evt => {
     this.transitioncancel = evt.elapsedTime;
-  }.bind(this);
+  };
 }
 
 TransitionEventHandler.prototype.clear = function() {
   this.transitionrun    = undefined;
   this.transitionstart  = undefined;
   this.transitionend    = undefined;
   this.transitioncancel = undefined;
 };
--- a/dom/base/DOMRequestHelper.jsm
+++ b/dom/base/DOMRequestHelper.jsm
@@ -298,20 +298,20 @@ DOMRequestIpcHelper.prototype = {
     return new this._window.Promise(aPromiseInit);
   },
 
   /**
    * createPromiseWithId() creates a new Promise, accepting a callback
    * which is immediately called with the generated resolverId.
    */
   createPromiseWithId: function(aCallback) {
-    return this.createPromise(function(aResolve, aReject) {
+    return this.createPromise((aResolve, aReject) => {
       let resolverId = this.getPromiseResolverId({ resolve: aResolve, reject: aReject });
       aCallback(resolverId);
-    }.bind(this));
+    });
   },
 
   forEachRequest: function(aCallback) {
     if (!this._requests) {
       return;
     }
 
     Object.keys(this._requests).forEach((aKey) => {
--- a/dom/base/IndexedDBHelper.jsm
+++ b/dom/base/IndexedDBHelper.jsm
@@ -138,17 +138,17 @@ IndexedDBHelper.prototype = {
    *        be invoked with the transaction and the `store' object store.
    * @param successCb
    *        Success callback to call on a successful transaction commit.
    *        The result is stored in txn.result.
    * @param failureCb
    *        Error callback to call when an error is encountered.
    */
   newTxn: function newTxn(txn_type, store_name, callback, successCb, failureCb) {
-    this.ensureDB(function () {
+    this.ensureDB(() => {
       if (DEBUG) debug("Starting new transaction" + txn_type);
       let txn;
       try {
         txn = this._db.transaction(Array.isArray(store_name) ? store_name : this.dbStoreNames, txn_type);
       } catch (e) {
         if (DEBUG) debug("Error starting transaction: " + this.dbName);
         failureCb(getErrorName(e));
         return;
@@ -177,17 +177,17 @@ IndexedDBHelper.prototype = {
          * event.target.error may be null
          * if txn was aborted by calling txn.abort()
          */
         if (failureCb) {
           failureCb(getErrorName(event.target.error));
         }
       };
       callback(txn, stores);
-    }.bind(this), failureCb);
+    }, failureCb);
   },
 
   /**
    * Initialize the DB. Does not call open.
    *
    * @param aDBName
    *        DB name for the open call.
    * @param aDBVersion
--- a/dom/browser-element/BrowserElementChildPreload.js
+++ b/dom/browser-element/BrowserElementChildPreload.js
@@ -739,20 +739,20 @@ BrowserElementChild.prototype = {
 
   _removeMozAfterPaintHandler: function(listener) {
     removeEventListener('MozAfterPaint', listener,
                         /* useCapture = */ true);
   },
 
   _activateNextPaintListener: function(e) {
     if (!this._nextPaintHandler) {
-      this._nextPaintHandler = this._addMozAfterPaintHandler(function () {
+      this._nextPaintHandler = this._addMozAfterPaintHandler(() => {
         this._nextPaintHandler = null;
         sendAsyncMsg('nextpaint');
-      }.bind(this));
+      });
     }
   },
 
   _deactivateNextPaintListener: function(e) {
     if (this._nextPaintHandler) {
       this._removeMozAfterPaintHandler(this._nextPaintHandler);
       this._nextPaintHandler = null;
     }
--- a/dom/imptests/idlharness.js
+++ b/dom/imptests/idlharness.js
@@ -148,18 +148,17 @@ IdlArray.prototype.internal_add_idls = f
     /**
      * Internal helper called by add_idls() and add_untested_idls().
      * parsed_idls is an array of objects that come from WebIDLParser.js's
      * "definitions" production.  The add_untested_idls() entry point
      * additionally sets an .untested property on each object (and its
      * .members) so that they'll be skipped by test() -- they'll only be
      * used for base interfaces of tested interfaces, return types, etc.
      */
-    parsed_idls.forEach(function(parsed_idl)
-    {
+    parsed_idls.forEach(parsed_idl => {
         if (parsed_idl.type == "interface" && parsed_idl.partial)
         {
             this.partials.push(parsed_idl);
             return;
         }
 
         if (parsed_idl.type == "implements")
         {
@@ -205,17 +204,17 @@ IdlArray.prototype.internal_add_idls = f
         case "callback interface":
             this.members[parsed_idl.name] =
                 new IdlInterface(parsed_idl, /* is_callback = */ true);
             break;
 
         default:
             throw parsed_idl.name + ": " + parsed_idl.type + " not yet supported";
         }
-    }.bind(this));
+    });
 };
 
 //@}
 IdlArray.prototype.add_objects = function(dict)
 //@{
 {
     /** Entry point.  See documentation at beginning of file. */
     for (var k in dict)
@@ -272,64 +271,58 @@ IdlArray.prototype.recursively_get_imple
 //@}
 IdlArray.prototype.test = function()
 //@{
 {
     /** Entry point.  See documentation at beginning of file. */
 
     // First merge in all the partial interfaces and implements statements we
     // encountered.
-    this.partials.forEach(function(parsed_idl)
-    {
+    this.partials.forEach(parsed_idl => {
         if (!(parsed_idl.name in this.members)
         || !(this.members[parsed_idl.name] instanceof IdlInterface))
         {
             throw "Partial interface " + parsed_idl.name + " with no original interface";
         }
         if (parsed_idl.extAttrs)
         {
-            parsed_idl.extAttrs.forEach(function(extAttr)
-            {
+            parsed_idl.extAttrs.forEach(extAttr => {
                 this.members[parsed_idl.name].extAttrs.push(extAttr);
-            }.bind(this));
+            });
         }
-        parsed_idl.members.forEach(function(member)
-        {
+        parsed_idl.members.forEach(member => {
             this.members[parsed_idl.name].members.push(new IdlInterfaceMember(member));
-        }.bind(this));
-    }.bind(this));
+        });
+    });
     this.partials = [];
 
     for (var lhs in this["implements"])
     {
-        this.recursively_get_implements(lhs).forEach(function(rhs)
-        {
+        this.recursively_get_implements(lhs).forEach(rhs => {
             var errStr = lhs + " implements " + rhs + ", but ";
             if (!(lhs in this.members)) throw errStr + lhs + " is undefined.";
             if (!(this.members[lhs] instanceof IdlInterface)) throw errStr + lhs + " is not an interface.";
             if (!(rhs in this.members)) throw errStr + rhs + " is undefined.";
             if (!(this.members[rhs] instanceof IdlInterface)) throw errStr + rhs + " is not an interface.";
-            this.members[rhs].members.forEach(function(member)
-            {
+            this.members[rhs].members.forEach(member => {
                 this.members[lhs].members.push(new IdlInterfaceMember(member));
-            }.bind(this));
-        }.bind(this));
+            });
+        });
     }
     this["implements"] = {};
 
     // Now run test() on every member, and test_object() for every object.
     for (var name in this.members)
     {
         this.members[name].test();
         if (name in this.objects)
         {
-            this.objects[name].forEach(function(str)
-            {
+            this.objects[name].forEach(str => {
                 this.members[name].test_object(str);
-            }.bind(this));
+            });
         }
     }
 };
 
 //@}
 IdlArray.prototype.assert_type_is = function(value, type)
 //@{
 {
@@ -633,18 +626,17 @@ IdlInterface.prototype.test = function()
     // interface are still tested.
     this.test_members();
 };
 //@}
 
 IdlInterface.prototype.test_self = function()
 //@{
 {
-    test(function()
-    {
+    test(() => {
         // This function tests WebIDL as of 2015-01-13.
         // TODO: Consider [Exposed].
 
         // "For every interface that is exposed in a given ECMAScript global
         // environment and:
         // * is a callback interface that has constants declared on it, or
         // * is a non-callback interface that is not declared with the
         //   [NoInterfaceObject] extended attribute,
@@ -731,27 +723,27 @@ IdlInterface.prototype.test_self = funct
         }
 
         if (!this.has_extended_attribute("Constructor")) {
             // "The internal [[Call]] method of the interface object behaves as
             // follows . . .
             //
             // "If I was not declared with a [Constructor] extended attribute,
             // then throw a TypeError."
-            assert_throws(new TypeError(), function() {
+            assert_throws(new TypeError(), () => {
                 self[this.name]();
-            }.bind(this), "interface object didn't throw TypeError when called as a function");
-            assert_throws(new TypeError(), function() {
+            }, "interface object didn't throw TypeError when called as a function");
+            assert_throws(new TypeError(), () => {
                 new self[this.name]();
-            }.bind(this), "interface object didn't throw TypeError when called as a constructor");
+            }, "interface object didn't throw TypeError when called as a constructor");
         }
-    }.bind(this), this.name + " interface: existence and properties of interface object");
+    }, this.name + " interface: existence and properties of interface object");
 
     if (!this.is_callback()) {
-        test(function() {
+        test(() => {
             // This function tests WebIDL as of 2014-10-25.
             // https://heycam.github.io/webidl/#es-interface-call
 
             assert_own_property(self, this.name,
                                 "self does not have own property " + format_value(this.name));
 
             // "Interface objects for non-callback interfaces MUST have a
             // property named “length” with attributes { [[Writable]]: false,
@@ -764,23 +756,22 @@ IdlInterface.prototype.test_self = funct
             assert_false(desc.writable, this.name + ".length is writable");
             assert_false(desc.enumerable, this.name + ".length is enumerable");
             assert_true(desc.configurable, this.name + ".length is not configurable");
 
             var constructors = this.extAttrs
                 .filter(function(attr) { return attr.name == "Constructor"; });
             var expected_length = minOverloadLength(constructors);
             assert_equals(self[this.name].length, expected_length, "wrong value for " + this.name + ".length");
-        }.bind(this), this.name + " interface object length");
+        }, this.name + " interface object length");
     }
 
     // TODO: Test named constructors if I find any interfaces that have them.
 
-    test(function()
-    {
+    test(() => {
         // This function tests WebIDL as of 2015-01-21.
         // https://heycam.github.io/webidl/#interface-object
 
         if (this.is_callback() && !this.has_constants()) {
             return;
         }
 
         assert_own_property(self, this.name,
@@ -873,20 +864,19 @@ IdlInterface.prototype.test_self = funct
         assert_class_string(self[this.name].prototype, this.name + "Prototype",
                             "class string of " + this.name + ".prototype");
         // String() should end up calling {}.toString if nothing defines a
         // stringifier.
         if (!this.has_stringifier()) {
             assert_equals(String(self[this.name].prototype), "[object " + this.name + "Prototype]",
                     "String(" + this.name + ".prototype)");
         }
-    }.bind(this), this.name + " interface: existence and properties of interface prototype object");
+    }, this.name + " interface: existence and properties of interface prototype object");
 
-    test(function()
-    {
+    test(() => {
         if (this.is_callback() && !this.has_constants()) {
             return;
         }
 
         assert_own_property(self, this.name,
                             "self does not have own property " + format_value(this.name));
 
         if (this.is_callback()) {
@@ -908,25 +898,24 @@ IdlInterface.prototype.test_self = funct
         var desc = Object.getOwnPropertyDescriptor(self[this.name].prototype, "constructor");
         assert_false("get" in desc, this.name + ".prototype.constructor has getter");
         assert_false("set" in desc, this.name + ".prototype.constructor has setter");
         assert_true(desc.writable, this.name + ".prototype.constructor is not writable");
         assert_false(desc.enumerable, this.name + ".prototype.constructor is enumerable");
         assert_true(desc.configurable, this.name + ".prototype.constructor in not configurable");
         assert_equals(self[this.name].prototype.constructor, self[this.name],
                       this.name + '.prototype.constructor is not the same object as ' + this.name);
-    }.bind(this), this.name + ' interface: existence and properties of interface prototype object\'s "constructor" property');
+    }, this.name + ' interface: existence and properties of interface prototype object\'s "constructor" property');
 };
 
 //@}
 IdlInterface.prototype.test_member_const = function(member)
 //@{
 {
-    test(function()
-    {
+    test(() => {
         if (this.is_callback() && !this.has_constants()) {
             return;
         }
 
         assert_own_property(self, this.name,
                             "self does not have own property " + format_value(this.name));
 
         // "For each constant defined on an interface A, there must be
@@ -941,21 +930,20 @@ IdlInterface.prototype.test_member_const
         // "The property has attributes { [[Writable]]: false,
         // [[Enumerable]]: true, [[Configurable]]: false }."
         var desc = Object.getOwnPropertyDescriptor(self[this.name], member.name);
         assert_false("get" in desc, "property has getter");
         assert_false("set" in desc, "property has setter");
         assert_false(desc.writable, "property is writable");
         assert_true(desc.enumerable, "property is not enumerable");
         assert_false(desc.configurable, "property is configurable");
-    }.bind(this), this.name + " interface: constant " + member.name + " on interface object");
+    }, this.name + " interface: constant " + member.name + " on interface object");
     // "In addition, a property with the same characteristics must
     // exist on the interface prototype object."
-    test(function()
-    {
+    test(() => {
         if (this.is_callback() && !this.has_constants()) {
             return;
         }
 
         assert_own_property(self, this.name,
                             "self does not have own property " + format_value(this.name));
 
         if (this.is_callback()) {
@@ -971,26 +959,25 @@ IdlInterface.prototype.test_member_const
         assert_equals(self[this.name].prototype[member.name], constValue(member.value),
                       "property has wrong value");
         var desc = Object.getOwnPropertyDescriptor(self[this.name], member.name);
         assert_false("get" in desc, "property has getter");
         assert_false("set" in desc, "property has setter");
         assert_false(desc.writable, "property is writable");
         assert_true(desc.enumerable, "property is not enumerable");
         assert_false(desc.configurable, "property is configurable");
-    }.bind(this), this.name + " interface: constant " + member.name + " on interface prototype object");
+    }, this.name + " interface: constant " + member.name + " on interface prototype object");
 };
 
 
 //@}
 IdlInterface.prototype.test_member_attribute = function(member)
 //@{
 {
-    test(function()
-    {
+    test(() => {
         if (this.is_callback() && !this.has_constants()) {
             return;
         }
 
         assert_own_property(self, this.name,
                             "self does not have own property " + format_value(this.name));
         assert_own_property(self[this.name], "prototype",
                             'interface "' + this.name + '" does not have own property "prototype"');
@@ -1027,34 +1014,33 @@ IdlInterface.prototype.test_member_attri
             }
             this.do_interface_attribute_asserts(self, member);
         } else {
             assert_true(member.name in self[this.name].prototype,
                 "The prototype object must have a property " +
                 format_value(member.name));
 
             if (!member.has_extended_attribute("LenientThis")) {
-                assert_throws(new TypeError(), function() {
+                assert_throws(new TypeError(), () => {
                     self[this.name].prototype[member.name];
-                }.bind(this), "getting property on prototype object must throw TypeError");
+                }, "getting property on prototype object must throw TypeError");
             } else {
                 assert_equals(self[this.name].prototype[member.name], undefined,
                               "getting property on prototype object must return undefined");
             }
             this.do_interface_attribute_asserts(self[this.name].prototype, member);
         }
-    }.bind(this), this.name + " interface: attribute " + member.name);
+    }, this.name + " interface: attribute " + member.name);
 };
 
 //@}
 IdlInterface.prototype.test_member_operation = function(member)
 //@{
 {
-    test(function()
-    {
+    test(() => {
         if (this.is_callback() && !this.has_constants()) {
             return;
         }
 
         assert_own_property(self, this.name,
                             "self does not have own property " + format_value(this.name));
 
         if (this.is_callback()) {
@@ -1085,17 +1071,17 @@ IdlInterface.prototype.test_member_opera
             memberHolderObject = self;
         } else {
             assert_own_property(self[this.name].prototype, member.name,
                     "interface prototype object missing non-static operation");
             memberHolderObject = self[this.name].prototype;
         }
 
         this.do_member_operation_asserts(memberHolderObject, member);
-    }.bind(this), this.name + " interface: operation " + member.name +
+    }, this.name + " interface: operation " + member.name +
     "(" + member.arguments.map(function(m) { return m.idlType.idlType; }) +
     ")");
 };
 
 //@}
 IdlInterface.prototype.do_member_operation_asserts = function(memberHolderObject, member)
 //@{
 {
@@ -1160,18 +1146,17 @@ IdlInterface.prototype.do_member_operati
         }, "calling operation with this = {} didn't throw TypeError");
     }
 }
 
 //@}
 IdlInterface.prototype.test_member_stringifier = function(member)
 //@{
 {
-    test(function()
-    {
+    test(() => {
         if (this.is_callback() && !this.has_constants()) {
             return;
         }
 
         assert_own_property(self, this.name,
                             "self does not have own property " + format_value(this.name));
 
         if (this.is_callback()) {
@@ -1217,17 +1202,17 @@ IdlInterface.prototype.test_member_strin
         // "If O is not an object that implements the interface on which the
         // stringifier was declared, then throw a TypeError."
         //
         // TODO: Test a platform object that implements some other
         // interface.  (Have to be sure to get inheritance right.)
         assert_throws(new TypeError(), function() {
             self[this.name].prototype.toString.apply({}, []);
         }, "calling stringifier with this = {} didn't throw TypeError");
-    }.bind(this), this.name + " interface: stringifier");
+    }, this.name + " interface: stringifier");
 };
 
 //@}
 IdlInterface.prototype.test_members = function()
 //@{
 {
     for (var i = 0; i < this.members.length; i++)
     {
@@ -1319,89 +1304,84 @@ IdlInterface.prototype.test_primary_inte
 {
     // We can't easily test that its prototype is correct if there's no
     // interface object, or the object is from a different global environment
     // (not instanceof Object).  TODO: test in this case that its prototype at
     // least looks correct, even if we can't test that it's actually correct.
     if (!this.has_extended_attribute("NoInterfaceObject")
     && (typeof obj != expected_typeof || obj instanceof Object))
     {
-        test(function()
-        {
+        test(() => {
             assert_equals(exception, null, "Unexpected exception when evaluating object");
             assert_equals(typeof obj, expected_typeof, "wrong typeof object");
             assert_own_property(self, this.name,
                                 "self does not have own property " + format_value(this.name));
             assert_own_property(self[this.name], "prototype",
                                 'interface "' + this.name + '" does not have own property "prototype"');
 
             // "The value of the internal [[Prototype]] property of the
             // platform object is the interface prototype object of the primary
             // interface from the platform object’s associated global
             // environment."
             assert_equals(Object.getPrototypeOf(obj),
                           self[this.name].prototype,
                           desc + "'s prototype is not " + this.name + ".prototype");
-        }.bind(this), this.name + " must be primary interface of " + desc);
+        }, this.name + " must be primary interface of " + desc);
     }
 
     // "The class string of a platform object that implements one or more
     // interfaces must be the identifier of the primary interface of the
     // platform object."
-    test(function()
-    {
+    test(() => {
         assert_equals(exception, null, "Unexpected exception when evaluating object");
         assert_equals(typeof obj, expected_typeof, "wrong typeof object");
         assert_class_string(obj, this.name, "class string of " + desc);
         if (!this.has_stringifier())
         {
             assert_equals(String(obj), "[object " + this.name + "]", "String(" + desc + ")");
         }
-    }.bind(this), "Stringification of " + desc);
+    }, "Stringification of " + desc);
 };
 
 //@}
 IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expected_typeof)
 //@{
 {
     // TODO: Indexed and named properties, more checks on interface members
     this.already_tested = true;
 
     for (var i = 0; i < this.members.length; i++)
     {
         var member = this.members[i];
         if (member.type == "attribute" && member.isUnforgeable)
         {
-            test(function()
-            {
+            test(() => {
                 assert_equals(exception, null, "Unexpected exception when evaluating object");
                 assert_equals(typeof obj, expected_typeof, "wrong typeof object");
                 this.do_interface_attribute_asserts(obj, member);
-            }.bind(this), this.name + " interface: " + desc + ' must have own property "' + member.name + '"');
+            }, this.name + " interface: " + desc + ' must have own property "' + member.name + '"');
         }
         else if (member.type == "operation" &&
                  member.name &&
                  member.isUnforgeable)
         {
-            test(function()
-            {
+            test(() => {
                 assert_equals(exception, null, "Unexpected exception when evaluating object");
                 assert_equals(typeof obj, expected_typeof, "wrong typeof object");
                 assert_own_property(obj, member.name,
                                     "Doesn't have the unforgeable operation property");
                 this.do_member_operation_asserts(obj, member);
-            }.bind(this), this.name + " interface: " + desc + ' must have own property "' + member.name + '"');
+            }, this.name + " interface: " + desc + ' must have own property "' + member.name + '"');
         }
         else if ((member.type == "const"
         || member.type == "attribute"
         || member.type == "operation")
         && member.name)
         {
-            test(function()
-            {
+            test(() => {
                 assert_equals(exception, null, "Unexpected exception when evaluating object");
                 assert_equals(typeof obj, expected_typeof, "wrong typeof object");
                 if (!member["static"]) {
                     if (!this.is_global()) {
                         assert_inherits(obj, member.name);
                     } else {
                         assert_own_property(obj, member.name);
                     }
@@ -1429,25 +1409,24 @@ IdlInterface.prototype.test_interface_of
                             this.array.assert_type_is(property, member.idlType);
                         }
                     }
                     if (member.type == "operation")
                     {
                         assert_equals(typeof obj[member.name], "function");
                     }
                 }
-            }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + member.name + '" with the proper type (' + i + ')');
+            }, this.name + " interface: " + desc + ' must inherit property "' + member.name + '" with the proper type (' + i + ')');
         }
         // TODO: This is wrong if there are multiple operations with the same
         // identifier.
         // TODO: Test passing arguments of the wrong type.
         if (member.type == "operation" && member.name && member.arguments.length)
         {
-            test(function()
-            {
+            test(() => {
                 assert_equals(exception, null, "Unexpected exception when evaluating object");
                 assert_equals(typeof obj, expected_typeof, "wrong typeof object");
                 if (!member["static"]) {
                     if (!this.is_global() && !member.isUnforgeable) {
                         assert_inherits(obj, member.name);
                     } else {
                         assert_own_property(obj, member.name);
                     }
@@ -1457,24 +1436,23 @@ IdlInterface.prototype.test_interface_of
                     assert_false(member.name in obj);
                 }
 
                 var minLength = minOverloadLength(this.members.filter(function(m) {
                     return m.type == "operation" && m.name == member.name;
                 }));
                 var args = [];
                 for (var i = 0; i < minLength; i++) {
-                    assert_throws(new TypeError(), function()
-                    {
+                    assert_throws(new TypeError(), () => {
                         obj[member.name].apply(obj, args);
-                    }.bind(this), "Called with " + i + " arguments");
+                    }, "Called with " + i + " arguments");
 
                     args.push(create_suitable_object(member.arguments[i].idlType));
                 }
-            }.bind(this), this.name + " interface: calling " + member.name +
+            }, this.name + " interface: calling " + member.name +
             "(" + member.arguments.map(function(m) { return m.idlType.idlType; }) +
             ") on " + desc + " with too few arguments must throw TypeError");
         }
     }
 };
 
 //@}
 IdlInterface.prototype.has_stringifier = function()
@@ -1535,19 +1513,19 @@ IdlInterface.prototype.do_interface_attr
 
     // "If the attribute is a regular attribute, then:"
     if (!member["static"]) {
         // "If O is not a platform object that implements I, then:
         // "If the attribute was specified with the [LenientThis] extended
         // attribute, then return undefined.
         // "Otherwise, throw a TypeError."
         if (!member.has_extended_attribute("LenientThis")) {
-            assert_throws(new TypeError(), function() {
+            assert_throws(new TypeError(), () => {
                 desc.get.call({});
-            }.bind(this), "calling getter on wrong object type must throw TypeError");
+            }, "calling getter on wrong object type must throw TypeError");
         } else {
             assert_equals(desc.get.call({}), undefined,
                           "calling getter on wrong object type must return undefined");
         }
     }
 
     // "The value of the Function object’s “length” property is the Number
     // value 0."
@@ -1575,19 +1553,19 @@ IdlInterface.prototype.do_interface_attr
         if (!member["static"]) {
             // "If /validThis/ is false and the attribute was not specified
             // with the [LenientThis] extended attribute, then throw a
             // TypeError."
             // "If the attribute is declared with a [Replaceable] extended
             // attribute, then: ..."
             // "If validThis is false, then return."
             if (!member.has_extended_attribute("LenientThis")) {
-                assert_throws(new TypeError(), function() {
+                assert_throws(new TypeError(), () => {
                     desc.set.call({});
-                }.bind(this), "calling setter on wrong object type must throw TypeError");
+                }, "calling setter on wrong object type must throw TypeError");
             } else {
                 assert_equals(desc.set.call({}), undefined,
                               "calling setter on wrong object type must return undefined");
             }
         }
 
         // "The value of the Function object’s “length” property is the Number
         // value 1."
--- a/dom/imptests/testharness.js
+++ b/dom/imptests/testharness.js
@@ -1515,23 +1515,23 @@ policies and contribution forms [3].
         this.phase = this.phases.INITIAL;
         this.update_state_from(clone);
         tests.push(this);
     }
 
     RemoteTest.prototype.structured_clone = function() {
         var clone = {};
         Object.keys(this).forEach(
-                (function(key) {
+                key => {
                     if (typeof(this[key]) === "object") {
                         clone[key] = merge({}, this[key]);
                     } else {
                         clone[key] = this[key];
                     }
-                }).bind(this));
+                });
         clone.phases = merge({}, this.phases);
         return clone;
     };
 
     RemoteTest.prototype.cleanup = function() {};
     RemoteTest.prototype.phases = Test.prototype.phases;
     RemoteTest.prototype.update_state_from = function(clone) {
         this.status = clone.status;
--- a/dom/indexedDB/test/unit/test_lowDiskSpace.js
+++ b/dom/indexedDB/test/unit/test_lowDiskSpace.js
@@ -728,26 +728,26 @@ RequestCounter.prototype = {
   decr: function() {
     if (!--this._counter) {
       continueToNextStepSync();
     }
   },
 
   handler: function(type, preventDefault) {
     this.incr();
-    return function(event) {
+    return event => {
       is(event.type, type || "success", "Correct type");
       this.decr();
-    }.bind(this);
+    };
   },
 
   errorHandler: function(eventType, errorName) {
     this.incr();
-    return function(event) {
+    return event => {
       is(event.type, eventType || "error", "Correct type");
       is(event.target.error.name, errorName || "QuotaExceededError",
           "Correct error name");
       event.preventDefault();
       event.stopPropagation();
       this.decr();
-    }.bind(this);
+    };
   }
 };
--- a/dom/manifest/Manifest.jsm
+++ b/dom/manifest/Manifest.jsm
@@ -135,17 +135,17 @@ class Manifest {
 var Manifests = {
 
   async initialise () {
 
     if (this.started) {
       return this.started;
     }
 
-    this.started = (async function() {
+    this.started = (async () => {
 
       // Make sure the manifests have the folder needed to save into
       await OS.File.makeDir(MANIFESTS_DIR, {ignoreExisting: true});
 
       // Ensure any existing scope data we have about manifests is loaded
       this._path = OS.Path.join(OS.Constants.Path.profileDir, MANIFESTS_FILE);
       this._store = new JSONFile({path: this._path});
       await this._store.load();
@@ -154,17 +154,17 @@ var Manifests = {
       if (!this._store.data.hasOwnProperty("scopes")) {
         this._store.data.scopes = new Map();
       }
 
       // Cache the Manifest objects creates as they are references to files
       // and we do not want multiple file handles
       this.manifestObjs = {};
 
-    }).bind(this)();
+    })();
 
     return this.started;
   },
 
   // When a manifest is installed, we save its scope so we can determine if
   // fiture visits fall within this manifests scope
   manifestInstalled(manifest) {
     this._store.data.scopes[manifest.scope] = manifest.url;
--- a/dom/media/test/manifest.js
+++ b/dom/media/test/manifest.js
@@ -1639,45 +1639,45 @@ function MediaTestManager() {
     this.tokens = [];
     this.isShutdown = false;
     this.numTestsRunning = 0;
     this.handlers = {};
     this.timers = {};
 
     // Always wait for explicit finish.
     SimpleTest.waitForExplicitFinish();
-    SpecialPowers.pushPrefEnv({'set': gTestPrefs}, (function() {
+    SpecialPowers.pushPrefEnv({'set': gTestPrefs}, () => {
       this.nextTest();
-    }).bind(this));
+    });
 
-    SimpleTest.registerCleanupFunction(function() {
+    SimpleTest.registerCleanupFunction(() => {
       if (this.tokens.length > 0) {
         info("Test timed out. Remaining tests=" + this.tokens);
       }
       for (var token of this.tokens) {
         var handler = this.handlers[token];
         if (handler && handler.ontimeout) {
           handler.ontimeout();
         }
       }
-    }.bind(this));
+    });
   }
 
   // Registers that the test corresponding to 'token' has been started.
   // Don't call more than once per token.
   this.started = function(token, handler) {
     this.tokens.push(token);
     this.numTestsRunning++;
     this.handlers[token] = handler;
 
-    var onTimeout = function() {
+    var onTimeout = () => {
       this.hasTimeout = true;
       ok(false, `${token} timed out!`);
       this.finished(token);
-    }.bind(this);
+    };
     // Default timeout to 180s for each test.
     this.timers[token] = setTimeout(onTimeout, 180000);
 
     is(this.numTestsRunning, this.tokens.length,
        "[started " + token + " t=" + elapsedTime(this.startTime) + "] Length of array should match number of running tests");
   }
 
   // Registers that the test corresponding to 'token' has finished. Call when
@@ -1733,22 +1733,22 @@ function MediaTestManager() {
     {
       this.isShutdown = true;
       if (this.onFinished) {
         this.onFinished();
       }
       if (this.hasTimeout) {
         dumpDebugInfo();
       }
-      var onCleanup = function() {
+      var onCleanup = () => {
         var end = new Date();
         SimpleTest.info("Finished at " + end + " (" + (end.getTime() / 1000) + "s)");
         SimpleTest.info("Running time: " + elapsedTime(this.startTime) + "s");
         SimpleTest.finish();
-      }.bind(this);
+      };
       mediaTestCleanup(onCleanup);
       return;
     }
   }
 }
 
 // Ensures we've got no active video or audio elements in the document, and
 // forces a GC to release the address space reserved by the decoders' threads'
--- a/dom/notification/NotificationDB.jsm
+++ b/dom/notification/NotificationDB.jsm
@@ -98,17 +98,17 @@ var NotificationDB = {
 
     return notifications;
   },
 
   // Attempt to read notification file, if it's not there we will create it.
   load: function() {
     var promise = OS.File.read(NOTIFICATION_STORE_PATH, { encoding: "utf-8"});
     return promise.then(
-      function onSuccess(data) {
+      data => {
         if (data.length > 0) {
           // Preprocessing phase intends to cleanly separate any migration-related
           // tasks.
           this.notifications = this.filterNonAppNotifications(JSON.parse(data));
         }
 
         // populate the list of notifications by tag
         if (this.notifications) {
@@ -119,23 +119,23 @@ var NotificationDB = {
               if (curNotification.tag) {
                 this.byTag[origin][curNotification.tag] = curNotification;
               }
             }
           }
         }
 
         this.loaded = true;
-      }.bind(this),
+      },
 
       // If read failed, we assume we have no notifications to load.
-      function onFailure(reason) {
+      reason => {
         this.loaded = true;
         return this.createStore();
-      }.bind(this)
+      }
     );
   },
 
   // Creates the notification directory.
   createStore: function() {
     var promise = OS.File.makeDir(NOTIFICATION_STORE_DIR, {
       ignoreExisting: true
     });
@@ -257,49 +257,49 @@ var NotificationDB = {
       if (DEBUG) { debug("No more tasks to run, queue depleted"); }
       this.runningTask = null;
       return;
     }
     this.runningTask = this.tasks.shift();
 
     // Always make sure we are loaded before performing any read/write tasks.
     this.ensureLoaded()
-    .then(function() {
+    .then(() => {
       var task = this.runningTask;
 
       switch (task.operation) {
         case "getall":
           return this.taskGetAll(task.data);
           break;
 
         case "save":
           return this.taskSave(task.data);
           break;
 
         case "delete":
           return this.taskDelete(task.data);
           break;
       }
 
-    }.bind(this))
-    .then(function(payload) {
+    })
+    .then(payload => {
       if (DEBUG) {
         debug("Finishing task: " + this.runningTask.operation);
       }
       this.runningTask.defer.resolve(payload);
-    }.bind(this))
-    .catch(function(err) {
+    })
+    .catch(err => {
       if (DEBUG) {
         debug("Error while running " + this.runningTask.operation + ": " + err);
       }
       this.runningTask.defer.reject(new String(err));
-    }.bind(this))
-    .then(function() {
+    })
+    .then(() => {
       this.runNextTask();
-    }.bind(this));
+    });
   },
 
   taskGetAll: function(data) {
     if (DEBUG) { debug("Task, getting all"); }
     var origin = data.origin;
     var notifications = [];
     // Grab only the notifications for specified origin.
     if (this.notifications[origin]) {
--- a/dom/notification/NotificationStorage.js
+++ b/dom/notification/NotificationStorage.js
@@ -243,27 +243,27 @@ NotificationStorage.prototype = {
     try {
       Services.tm.dispatchToMainThread(callback.done);
     } catch (e) {
       if (DEBUG) { debug("Error calling callback done: " + e); }
     }
   },
 
   _populateCache: function(notifications) {
-    notifications.forEach(function(notification) {
+    notifications.forEach(notification => {
       this._notifications[notification.id] = notification;
       if (notification.tag && notification.origin) {
         let tag = notification.tag;
         let origin = notification.origin;
         if (!this._byTag[origin]) {
           this._byTag[origin] = {};
         }
         this._byTag[origin][tag] = notification;
       }
-    }.bind(this));
+    });
     this._cached = true;
   },
 
   classID : Components.ID(NOTIFICATIONSTORAGE_CID),
   contractID : NOTIFICATIONSTORAGE_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI([Ci.nsINotificationStorage,
                                          Ci.nsIMessageListener]),
 };
--- a/dom/presentation/tests/xpcshell/test_multicast_dns_device_provider.js
+++ b/dom/presentation/tests/xpcshell/test_multicast_dns_device_provider.js
@@ -234,19 +234,19 @@ function registerService() {
   let mockObj = {
     QueryInterface: XPCOMUtils.generateQI([Ci.nsIDNSServiceDiscovery]),
     startDiscovery: function(serviceType, listener) {},
     registerService: function(serviceInfo, listener) {
       deferred.resolve();
       this.serviceRegistered++;
       return {
         QueryInterface: XPCOMUtils.generateQI([Ci.nsICancelable]),
-        cancel: function() {
+        cancel: () => {
           this.serviceUnregistered++;
-        }.bind(this)
+        }
       };
     },
     resolveService: function(serviceInfo, listener) {},
     serviceRegistered: 0,
     serviceUnregistered: 0
   };
   let contractHook = new ContractHook(SD_CONTRACT_ID, mockObj);
   let provider = Cc[PROVIDER_CONTRACT_ID].createInstance(Ci.nsIPresentationDeviceProvider);
@@ -323,19 +323,19 @@ function registerServiceDynamically() {
   let mockObj = {
     QueryInterface: XPCOMUtils.generateQI([Ci.nsIDNSServiceDiscovery]),
     startDiscovery: function(serviceType, listener) {},
     registerService: function(serviceInfo, listener) {
       deferred.resolve();
       this.serviceRegistered++;
       return {
         QueryInterface: XPCOMUtils.generateQI([Ci.nsICancelable]),
-        cancel: function() {
+        cancel: () => {
           this.serviceUnregistered++;
-        }.bind(this)
+        }
       };
     },
     resolveService: function(serviceInfo, listener) {},
     serviceRegistered: 0,
     serviceUnregistered: 0
   };
   let contractHook = new ContractHook(SD_CONTRACT_ID, mockObj);
   let provider = Cc[PROVIDER_CONTRACT_ID].createInstance(Ci.nsIPresentationDeviceProvider);
@@ -1171,19 +1171,19 @@ function serverClosed() {
         QueryInterface: XPCOMUtils.generateQI([Ci.nsICancelable]),
         cancel: function() {}
       };
     },
     registerService: function(serviceInfo, listener) {
       this.serviceRegistered++;
       return {
         QueryInterface: XPCOMUtils.generateQI([Ci.nsICancelable]),
-        cancel: function() {
+        cancel: () => {
           this.serviceUnregistered++;
-        }.bind(this)
+        }
       };
     },
     resolveService: function(serviceInfo, listener) {
       Assert.equal(serviceInfo.serviceName, mockDevice.serviceName);
       Assert.equal(serviceInfo.serviceType, mockDevice.serviceType);
       listener.onServiceResolved(createDevice(mockDevice.host,
                                               mockDevice.port,
                                               mockDevice.serviceName,
--- a/dom/system/NetworkGeolocationProvider.js
+++ b/dom/system/NetworkGeolocationProvider.js
@@ -386,41 +386,41 @@ WifiGeoPositionProvider.prototype = {
       this.notifyListener("notifyError",
                           [POSITION_UNAVAILABLE]);
       return;
     }
     xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
     xhr.responseType = "json";
     xhr.mozBackgroundRequest = true;
     xhr.timeout = Services.prefs.getIntPref("geo.wifi.xhr.timeout");
-    xhr.ontimeout = (function() {
+    xhr.ontimeout = () => {
       LOG("Location request XHR timed out.")
       this.notifyListener("notifyError",
                           [POSITION_UNAVAILABLE]);
-    }).bind(this);
-    xhr.onerror = (function() {
+    };
+    xhr.onerror = () => {
       this.notifyListener("notifyError",
                           [POSITION_UNAVAILABLE]);
-    }).bind(this);
-    xhr.onload = (function() {
+    };
+    xhr.onload = () => {
       LOG("server returned status: " + xhr.status + " --> " +  JSON.stringify(xhr.response));
       if ((xhr.channel instanceof Ci.nsIHttpChannel && xhr.status != 200) ||
           !xhr.response || !xhr.response.location) {
         this.notifyListener("notifyError",
                             [POSITION_UNAVAILABLE]);
         return;
       }
 
       let newLocation = new WifiGeoPositionObject(xhr.response.location.lat,
                                                   xhr.response.location.lng,
                                                   xhr.response.accuracy);
 
       this.notifyListener("update", [newLocation]);
       gCachedRequest = new CachedRequest(newLocation, data.cellTowers, data.wifiAccessPoints);
-    }).bind(this);
+    };
 
     var requestData = JSON.stringify(data);
     LOG("sending " + requestData);
     xhr.send(requestData);
   },
 
   notifyListener: function(listenerFunc, args) {
     args = args || [];
--- a/layout/style/crashtests/1017798-1.html
+++ b/layout/style/crashtests/1017798-1.html
@@ -28,19 +28,19 @@ gaia_switch/examples/index.html from the
       this.appendChild(style);
 
       if (!this.shadowRoot) {
         return;
       }
 
       // The setTimeout is necessary to avoid missing @import styles
       // when appending two stylesheets. Bug 1003294.
-      setTimeout(function nextTick() {
+      setTimeout(() => {
         this.shadowRoot.appendChild(style.cloneNode(true));
-      }.bind(this));
+      });
     }
 
   };
 
   exports.ComponentUtils = ComponentUtils;
 
 }(window));
 </script>
--- a/layout/style/test/test_redundant_font_download.html
+++ b/layout/style/test/test_redundant_font_download.html
@@ -62,23 +62,23 @@
     function getLastRequest() {
       return getRequestLog().split(";").pop();
     }
 
     // poll the server at intervals of 'delay' ms until it has seen a specific request,
     // or until maxTime ms have passed
     function waitForRequest(request, delay, maxTime, func) {
       timeLimit = Date.now() + maxTime;
-      var intervalId = window.setInterval(function() {
+      var intervalId = window.setInterval(() => {
         var req = getLastRequest();
         if (req == request || Date.now() > timeLimit) {
           window.clearInterval(intervalId);
           func();
         }
-      }.bind(this), delay);
+      }, delay);
     }
 
     // initially disable the second of the <style> elements,
     // so we only have a single copy of the font-face
     document.getElementsByTagName("style")[1].disabled = true;
 
     SimpleTest.waitForExplicitFinish();
 
--- a/media/webrtc/trunk/webrtc/tools/rtcbot/botmanager.js
+++ b/media/webrtc/trunk/webrtc/tools/rtcbot/botmanager.js
@@ -138,62 +138,62 @@ BrowserBot.prototype = {
 
   __proto__: Bot.prototype
 }
 
 // AndroidChromeBot spawns a process to open
 // "https://localhost:8080/bot/browser/" on chrome for Android.
 AndroidChromeBot = function (name, androidDeviceManager, callback) {
   Bot.call(this, name, callback);
-  androidDeviceManager.getNewDevice(function (serialNumber) {
+  androidDeviceManager.getNewDevice(serialNumber => {
     this.serialNumber_ = serialNumber;
     this.spawnBotProcess_();
-  }.bind(this));
+  });
 }
 
 AndroidChromeBot.prototype = {
   spawnBotProcess_: function () {
     this.log('Spawning Android device with serial ' + this.serialNumber_);
     var runChrome = 'adb -s ' + this.serialNumber_ + ' shell am start ' +
     '-n com.android.chrome/com.google.android.apps.chrome.Main ' +
     '-d https://localhost:8080/bot/browser/';
-    child.exec(runChrome, function (error, stdout, stderr) {
+    child.exec(runChrome, (error, stdout, stderr) => {
       if (error) {
         this.log(error);
         process.exit(1);
       }
       this.log('Opening Chrome for Android...');
       this.log(stdout);
-    }.bind(this));
+    });
   },
 
   __proto__: Bot.prototype
 }
 
 AndroidDeviceManager = function () {
   this.connectedDevices_ = [];
 }
 
 AndroidDeviceManager.prototype = {
   getNewDevice: function (callback) {
-    this.listDevices_(function (devices) {
+    this.listDevices_(devices => {
       for (var i = 0; i < devices.length; i++) {
         if (!this.connectedDevices_[devices[i]]) {
           this.connectedDevices_[devices[i]] = devices[i];
           callback(this.connectedDevices_[devices[i]]);
           return;
         }
       }
       if (devices.length == 0) {
         console.log('Error: No connected devices!');
       } else {
         console.log('Error: There is no enough connected devices.');
       }
       process.exit(1);
-    }.bind(this));
+    });
   },
 
   listDevices_: function (callback) {
     child.exec('adb devices' , function (error, stdout, stderr) {
       var devices = [];
       if (error || stderr) {
         console.log(error || stderr);
       }
--- a/media/webrtc/trunk/webrtc/tools/rtcbot/test.js
+++ b/media/webrtc/trunk/webrtc/tools/rtcbot/test.js
@@ -131,23 +131,23 @@ StatisticsReport.prototype = {
         outputStats[stats[index].name] = isNaN(statValue)?
             stats[index].stat : statValue;
       }
       return outputStats;
     };
   },
 
   finish: function (doneCallback) {
-    fs.exists("test/reports/", function (exists) {
+    fs.exists("test/reports/", exists => {
       if(exists) {
         writeFile.bind(this)();
       } else {
         fs.mkdir("test/reports/", 0o777, writeFile.bind(this));
       }
-    }.bind(this));
+    });
 
     function writeFile () {
       fs.writeFile("test/reports/" + this.outputFileName_ + "_" +
         (new Date()).getTime() +".json", JSON.stringify(this.output_),
         doneCallback);
     }
   },
 };
--- a/mobile/android/chrome/content/CastingApps.js
+++ b/mobile/android/chrome/content/CastingApps.js
@@ -615,17 +615,17 @@ var CastingApps = {
     if (!aVideo) {
       return;
     }
 
     function filterFunc(aService) {
       return this.allowableExtension(aVideo.sourceURI, aService.extensions) || this.allowableMimeType(aVideo.type, aService.types);
     }
 
-    this.prompt(function(aService) {
+    this.prompt(aService => {
       if (!aService)
         return;
 
       // Make sure we have a player app for the given service
       let app = SimpleServiceDiscovery.findAppForService(aService);
       if (!app)
         return;
 
@@ -633,44 +633,44 @@ var CastingApps = {
         aVideo.title = aVideo.element.ownerGlobal.top.document.title;
 
         // If the video is currently playing on the device, pause it
         if (!aVideo.element.paused) {
           aVideo.element.pause();
         }
       }
 
-      app.stop(function() {
-        app.start(function(aStarted) {
+      app.stop(() => {
+        app.start(aStarted => {
           if (!aStarted) {
             dump("CastingApps: Unable to start app");
             return;
           }
 
-          app.remoteMedia(function(aRemoteMedia) {
+          app.remoteMedia(aRemoteMedia => {
             if (!aRemoteMedia) {
               dump("CastingApps: Failed to create remotemedia");
               return;
             }
 
             this.session = {
               service: aService,
               app: app,
               remoteMedia: aRemoteMedia,
               data: {
                 title: aVideo.title,
                 source: aVideo.source,
                 poster: aVideo.poster
               },
               videoRef: Cu.getWeakReference(aVideo.element)
             };
-          }.bind(this), this);
-        }.bind(this));
-      }.bind(this));
-    }.bind(this), filterFunc.bind(this));
+          }, this);
+        });
+      });
+    }, filterFunc.bind(this));
   },
 
   closeExternal: function() {
     if (!this.session) {
       return;
     }
 
     this.session.remoteMedia.shutdown();
--- a/mobile/android/chrome/content/FeedHandler.js
+++ b/mobile/android/chrome/content/FeedHandler.js
@@ -71,23 +71,23 @@ var FeedHandler = {
       // First, let's decide on which feed to subscribe
       let feedIndex = -1;
       if (feeds.length > 1) {
         let p = new Prompt({
           window: browser.contentWindow,
           title: Strings.browser.GetStringFromName("feedHandler.chooseFeed")
         }).setSingleChoiceItems(feeds.map(function(feed) {
           return { label: feed.title || feed.href }
-        })).show((function(data) {
+        })).show(data => {
           feedIndex = data.button;
           if (feedIndex == -1)
             return;
 
           this.loadFeed(feeds[feedIndex], browser);
-        }).bind(this));
+        });
         return;
       }
 
       this.loadFeed(feeds[0], browser);
     }
   },
 
   loadFeed: function fh_loadFeed(aFeed, aBrowser) {
--- a/mobile/android/chrome/content/InputWidgetHelper.js
+++ b/mobile/android/chrome/content/InputWidgetHelper.js
@@ -31,17 +31,17 @@ var InputWidgetHelper = {
         Strings.browser.GetStringFromName("inputWidgetHelper.clear"),
         Strings.browser.GetStringFromName("inputWidgetHelper.cancel")
       ],
     }).addDatePicker({
       value: aElement.value,
       type: type,
       min: aElement.min,
       max: aElement.max,
-    }).show((function(data) {
+    }).show(data => {
       let changed = false;
       if (data.button == -1) {
         // This type is not supported with this android version.
         return;
       }
       if (data.button == 1) {
         // The user cleared the value.
         if (aElement.value != "") {
@@ -54,17 +54,17 @@ var InputWidgetHelper = {
           aElement.value = data[type + "0"];
           changed = true;
         }
       }
       // Else the user canceled the input.
 
       if (changed)
         this.fireOnChange(aElement);
-    }).bind(this));
+    });
   },
 
   hasInputWidget: function(aElement) {
     if (!(aElement instanceof HTMLInputElement))
       return false;
 
     let type = aElement.getAttribute('type');
     if (type == "date" || type == "datetime" || type == "datetime-local" ||
--- a/mobile/android/chrome/content/Linkify.js
+++ b/mobile/android/chrome/content/Linkify.js
@@ -82,27 +82,27 @@ Linkifier.prototype = {
          node.parentNode.tagName != 'APPLET' &&
          node.parentNode.tagName != 'TEXTAREA')
         return NodeFilter.FILTER_ACCEPT;
       else
         return NodeFilter.FILTER_REJECT;
     }
 
     let nodeWalker = aDoc.createTreeWalker(aDoc.body, NodeFilter.SHOW_TEXT, filterNode, false);
-    let parseNode = function() {
+    let parseNode = () => {
       let node = nodeWalker.nextNode();
       if (!node) {
         this._linkifyTimer = null;
         return;
       }
       let lastAddedNode = this._linkifyNodeNumbers(node, aDoc);
       // we assign a different timeout whether the node was processed or not.
       if (lastAddedNode) {
         nodeWalker.currentNode = lastAddedNode;
         this._linkifyTimer = setTimeout(parseNode, LINKIFY_TIMEOUT);
       } else {
         this._linkifyTimer = setTimeout(parseNode, LINKIFY_TIMEOUT);
       }
-    }.bind(this);
+    };
 
     this._linkifyTimer = setTimeout(parseNode, LINKIFY_TIMEOUT); 
   }
 };
--- a/mobile/android/chrome/content/aboutAddons.js
+++ b/mobile/android/chrome/content/aboutAddons.js
@@ -145,20 +145,20 @@ var Addons = {
   _restartCount: 0,
 
   _createItem: function _createItem(aAddon) {
     let outer = document.createElement("div");
     outer.setAttribute("addonID", aAddon.id);
     outer.className = "addon-item list-item";
     outer.setAttribute("role", "button");
     outer.setAttribute("contextmenu", "addonmenu");
-    outer.addEventListener("click", function() {
+    outer.addEventListener("click", () => {
       this.showDetails(outer);
       history.pushState({ id: aAddon.id }, document.title);
-    }.bind(this), true);
+    }, true);
 
     let img = document.createElement("img");
     img.className = "icon";
     img.setAttribute("src", aAddon.iconURL || AMO_ICON);
     outer.appendChild(img);
 
     let inner = document.createElement("div");
     inner.className = "inner";
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -2338,21 +2338,21 @@ var NativeWindow = {
         aButtons = [];
       }
 
       if (aButtons.length > 2) {
         console.log("Doorhanger can have a maximum of two buttons!");
         aButtons.length = 2;
       }
 
-      aButtons.forEach((function(aButton) {
+      aButtons.forEach(aButton => {
         this._callbacks[this._callbacksId] = { cb: aButton.callback, prompt: this._promptId };
         aButton.callback = this._callbacksId;
         this._callbacksId++;
-      }).bind(this));
+      });
 
       this._promptId++;
       let json = {
         type: "Doorhanger:Add",
         message: aMessage,
         value: aValue,
         buttons: aButtons,
         // use the current tab if none is provided
@@ -2545,17 +2545,17 @@ var NativeWindow = {
           let request = aElement.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST);
           return (request && (request.imageStatus & request.STATUS_SIZE_AVAILABLE));
         }
         return false;
       }
     },
 
     imageShareableContext: {
-      matches: function imageShareableContextMatches(aElement) {
+      matches: aElement => {
         let imgSrc = '';
         if (aElement instanceof Ci.nsIDOMHTMLImageElement) {
           imgSrc = aElement.src;
         } else if (aElement instanceof Ci.nsIImageLoadingContent &&
             aElement.currentURI &&
             aElement.currentURI.spec) {
           imgSrc = aElement.currentURI.spec;
         }
@@ -2565,17 +2565,17 @@ var NativeWindow = {
         // (shared by all transactions in progress) - otherwise we crash! (bug 1243305)
         //   https://developer.android.com/reference/android/os/TransactionTooLargeException.html
         //
         // The transaction limit is 1MB and we arbitrarily choose to cap this transaction at 1/4 of that = 250,000 bytes.
         // In Java, a UTF-8 character is 1-4 bytes so, 250,000 bytes / 4 bytes/char = 62,500 char
         let MAX_IMG_SRC_LEN = 62500;
         let isTooLong = imgSrc.length >= MAX_IMG_SRC_LEN;
         return !isTooLong && this.NativeWindow.contextmenus.imageSaveableContext.matches(aElement);
-      }.bind(this)
+      }
     },
 
     mediaSaveableContext: {
       matches: function mediaSaveableContextMatches(aElement) {
         return (aElement instanceof HTMLVideoElement ||
                aElement instanceof HTMLAudioElement);
       }
     },
@@ -4090,20 +4090,20 @@ Tab.prototype = {
           metadata: this.metatags,
         });
 
         // Reset isSearch so that the userRequested term will be erased on next page load
         this.metatags = null;
 
         if (docURI.startsWith("about:certerror") || docURI.startsWith("about:blocked")) {
           this.browser.addEventListener("click", ErrorPageEventHandler, true);
-          let listener = function() {
+          let listener = () => {
             this.browser.removeEventListener("click", ErrorPageEventHandler, true);
             this.browser.removeEventListener("pagehide", listener, true);
-          }.bind(this);
+          };
 
           this.browser.addEventListener("pagehide", listener, true);
         }
 
         if (!docURI.startsWith("about:")) {
           WebsiteMetadata.parseAsynchronously(this.browser.contentDocument);
         }
 
@@ -6250,34 +6250,34 @@ var SearchEngines = {
 
     let browser = tab.browser;
     let engines = browser.engines;
 
     let p = new Prompt({
       window: browser.contentWindow
     }).setSingleChoiceItems(engines.map(function(e) {
       return { label: e.title };
-    })).show((function(data) {
+    })).show(data => {
       if (data.button == -1)
         return;
 
       this.addOpenSearchEngine(engines[data.button]);
       engines.splice(data.button, 1);
 
       if (engines.length < 1) {
         // Broadcast message that there are no more add-able search engines.
         let newEngineMessage = {
           type: "Link:OpenSearch",
           tabID: tab.id,
           visible: false
         };
 
         GlobalEventDispatcher.sendRequest(newEngineMessage);
       }
-    }).bind(this));
+    });
   },
 
   addOpenSearchEngine: function addOpenSearchEngine(engine) {
     Services.search.addEngine(engine.url, Ci.nsISearchEngine.DATA_XML, engine.iconURL, false, {
       onSuccess: function() {
         // Display a toast confirming addition of new search engine.
         Snackbars.show(Strings.browser.formatStringFromName("alertSearchEngineAddedToast", [engine.title], 1), Snackbars.LENGTH_LONG);
       },
--- a/mobile/android/chrome/content/config.js
+++ b/mobile/android/chrome/content/config.js
@@ -235,21 +235,21 @@ var AboutConfig = {
   },
 
   // Buffer down rapid changes in filterInput value from keyboard
   bufferFilterInput: function AC_bufferFilterInput() {
     if (this._filterChangeTimer) {
       clearTimeout(this._filterChangeTimer);
     }
 
-    this._filterChangeTimer = setTimeout((function() {
+    this._filterChangeTimer = setTimeout(() => {
       this._filterChangeTimer = null;
       // Display updated prefs list when filterInput value settles
       this._displayNewList();
-    }).bind(this), FILTER_CHANGE_TRIGGER);
+    }, FILTER_CHANGE_TRIGGER);
   },
 
   // Update displayed list when filterInput value changes
   _displayNewList: function AC_displayNewList() {
     // This survives the search filter value past a page refresh
     this.filterInput.setAttribute("value", this.filterInput.value);
 
     // Don't start new filter search if same as last
@@ -260,19 +260,19 @@ var AboutConfig = {
 
     // Clear list item selection / context menu, prefs list, get first buffer, set scrolling on
     this.selected = "";
     this._clearPrefsContainer();
     this._addMorePrefsToContainer();
     window.onscroll = this.onScroll.bind(this);
 
     // Pause for screen to settle, then ensure at top
-    setTimeout((function() {
+    setTimeout(() => {
       window.scrollTo(0, 0);
-    }).bind(this), INITIAL_PAGE_DELAY);
+    }, INITIAL_PAGE_DELAY);
   },
 
   // Clear the displayed preferences list
   _clearPrefsContainer: function AC_clearPrefsContainer() {
     // Quick clear the prefsContainer list
     let empty = this._prefsContainer.cloneNode(false);
     this._prefsContainer.parentNode.replaceChild(empty, this._prefsContainer); 
     this._prefsContainer = empty;
--- a/mobile/android/components/SessionStore.js
+++ b/mobile/android/components/SessionStore.js
@@ -173,29 +173,29 @@ SessionStore.prototype = {
         log("ClosedTabs:StopNotifications");
         break;
 
       case "Session:Restore": {
         EventDispatcher.instance.unregisterListener(this, "Session:Restore");
         if (data) {
           // Be ready to handle any restore failures by making sure we have a valid tab opened
           let window = Services.wm.getMostRecentWindow("navigator:browser");
-          let restoreCleanup = (function (aSubject, aTopic, aData) {
+          let restoreCleanup = (aSubject, aTopic, aData) => {
               Services.obs.removeObserver(restoreCleanup, "sessionstore-windows-restored");
 
               if (window.BrowserApp.tabs.length == 0) {
                 window.BrowserApp.addTab("about:home", {
                   selected: true
                 });
               }
               // Normally, _restoreWindow() will have set this to true already,
               // but we want to make sure it's set even in case of a restore failure.
               this._startupRestoreFinished = true;
               log("startupRestoreFinished = true (through notification)");
-          }).bind(this);
+          };
           Services.obs.addObserver(restoreCleanup, "sessionstore-windows-restored");
 
           // Do a restore, triggered by Java
           this.restoreLastSession(data.sessionString);
         } else {
           // Not doing a restore; just send restore message
           this._startupRestoreFinished = true;
           log("startupRestoreFinished = true");
--- a/mobile/android/modules/JNI.jsm
+++ b/mobile/android/modules/JNI.jsm
@@ -1013,17 +1013,17 @@ function JNILoadClass(jenv, classSig, op
                                        unwrap(value, jenv, jobject));
       };
       rpp.getElements = function(start, len) {
         var i, r=[];
         for (i=0; i<len; i++) { r.push(this.get(start+i)); }
         return r;
       };
       rpp.setElements = function(start, vals) {
-        vals.forEach(function(v, i) { this.set(start+i, v); }.bind(this));
+        vals.forEach((v, i) => { this.set(start+i, v); });
       };
       r['new'] = function(length) {
         return wrap(jenvpp().NewObjectArray(jenv, length, elemClass, null),
                     classSig);
       };
     } else {
       var ty = sig2type(elemSig), ctype = sig2ctype(elemSig);
       var constructor = "New"+ty+"Array";
--- a/mobile/android/modules/MediaPlayerApp.jsm
+++ b/mobile/android/modules/MediaPlayerApp.jsm
@@ -63,19 +63,19 @@ MediaPlayerApp.prototype = {
 
 /* RemoteMedia provides a proxy to a native media player session.
  */
 function RemoteMedia(id, listener) {
   this._id = id;
   this._listener = listener;
 
   if ("onRemoteMediaStart" in this._listener) {
-    Services.tm.dispatchToMainThread((function() {
+    Services.tm.dispatchToMainThread(() => {
       this._listener.onRemoteMediaStart(this);
-    }).bind(this));
+    });
   }
 }
 
 RemoteMedia.prototype = {
   shutdown: function shutdown() {
     EventDispatcher.instance.unregisterListener(this, [
       "MediaPlayer:Playing",
       "MediaPlayer:Paused",
--- a/netwerk/protocol/http/UserAgentUpdates.jsm
+++ b/netwerk/protocol/http/UserAgentUpdates.jsm
@@ -223,25 +223,25 @@ this.UserAgentUpdates = {
     });
     request.addEventListener("error", error);
     request.send();
   },
 
   _update: function() {
     let url = this._getUpdateURL();
     url && this._fetchUpdate(url,
-      (function(response) { // success
+      response => { // success
         // apply update and save overrides to profile
         this._applyUpdate(response);
         this._saveToFile(response);
         this._scheduleUpdate(); // cancel any retries
-      }).bind(this),
-      (function(response) { // error
+      },
+      response => { // error
         this._scheduleUpdate(true /* retry */);
-      }).bind(this));
+      });
   },
 
   _scheduleUpdate: function(retry) {
     // only schedule updates in the main process
     if (gApp.processType !== Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) {
       return;
     }
     let interval = this._getPref(PREF_UPDATES_INTERVAL, 604800 /* 1 week */);
--- a/services/cloudsync/CloudSyncBookmarks.jsm
+++ b/services/cloudsync/CloudSyncBookmarks.jsm
@@ -771,20 +771,20 @@ var RootFolder = function(rootId, rootNa
   });
 
   let deferred = Promise.defer();
   let getGuidForRootFolder = function() {
     return PlacesWrapper.localIdToGuid(rootId);
   }
   PlacesWrapper.updateCachedFolderIds(folderCache, rootId)
                .then(getGuidForRootFolder, getGuidForRootFolder)
-               .then(function(guid) {
+               .then(guid => {
                        rootGuid = guid;
                        deferred.resolve(this);
-                     }.bind(this),
+                     },
                      deferred.reject);
   return deferred.promise;
 };
 
 RootFolder.prototype = {
   BOOKMARK: CS_BOOKMARK,
   FOLDER: CS_FOLDER,
   SEPARATOR: CS_SEPARATOR,
--- a/services/cloudsync/CloudSyncPlacesWrapper.jsm
+++ b/services/cloudsync/CloudSyncPlacesWrapper.jsm
@@ -132,17 +132,17 @@ PlacesWrapper.prototype = {
                "FROM moz_bookmarks " +
                "WHERE parent = :parent_id AND type = :item_type";
     let query = this.placesQueries.getQuery(stmt);
 
     query.params.parent_id = folder;
     query.params.item_type = PlacesUtils.bookmarks.TYPE_FOLDER;
 
     this.asyncQuery(query, ["id", "guid"]).then(
-      function(items) {
+      items => {
         let previousIds = folderCache.getChildren(folder);
         let currentIds = new Set();
         for (let item of items) {
           currentIds.add(item.id);
         }
         let newIds = new Set();
         let missingIds = new Set();
 
@@ -164,17 +164,17 @@ PlacesWrapper.prototype = {
           promises.push(this.updateCachedFolderIds(folderCache, newId));
         }
         Promise.all(promises)
                .then(deferred.resolve, deferred.reject);
 
         for (let missingId of missingIds) {
           folderCache.remove(missingId);
         }
-      }.bind(this)
+      }
     );
 
     return deferred.promise;
   },
 
   getLocalIdsWithAnnotation(anno) {
     let deferred = Promise.defer();
     let stmt = "SELECT a.item_id " +
--- a/services/common/modules-testing/storageserver.js
+++ b/services/common/modules-testing/storageserver.js
@@ -1341,24 +1341,24 @@ StorageServer.prototype = {
       // Enforce authentication.
       if (!req.hasHeader("authorization")) {
         this.respond(req, resp, 401, "Authorization Required", "{}", {
           "WWW-Authenticate": 'Basic realm="secret"'
         });
         return;
       }
 
-      let ensureUserExists = function ensureUserExists(username) {
+      let ensureUserExists = username => {
         if (this.userExists(username)) {
           return;
         }
 
         this._log.info("StorageServer: Unknown user: " + username);
         throw HTTP_401;
-      }.bind(this);
+      };
 
       let auth = req.getHeader("authorization");
       this._log.debug("Authorization: " + auth);
 
       if (auth.indexOf("Basic ") == 0) {
         let decoded = CommonUtils.safeAtoB(auth.substr(6));
         this._log.debug("Decoded Basic Auth: " + decoded);
         let [user, password] = decoded.split(":", 2);
--- a/services/sync/Weave.js
+++ b/services/sync/Weave.js
@@ -112,17 +112,17 @@ WeaveService.prototype = {
                getService(Ci.nsIObserverService);
       os.addObserver(this, "final-ui-startup", true);
       break;
 
     case "final-ui-startup":
       // Force Weave service to load if it hasn't triggered from overlays
       this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
       this.timer.initWithCallback({
-        notify: function() {
+        notify: () => {
           let isConfigured = false;
           // We only load more if it looks like Sync is configured.
           if (this.enabled) {
             // We have an associated FxAccount. So, do a more thorough check.
             // This will import a number of modules and thus increase memory
             // accordingly. We could potentially copy code performed by
             // this check into this file if our above code is yielding too
             // many false positives.
@@ -130,17 +130,17 @@ WeaveService.prototype = {
             isConfigured = Weave.Status.checkSetup() != Weave.CLIENT_NOT_CONFIGURED;
           }
           let getHistogramById = Services.telemetry.getHistogramById;
           getHistogramById("WEAVE_CONFIGURED").add(isConfigured);
           if (isConfigured) {
             getHistogramById("WEAVE_CONFIGURED_MASTER_PASSWORD").add(Utils.mpEnabled());
             this.ensureLoaded();
           }
-        }.bind(this)
+        }
       }, 10000, Ci.nsITimer.TYPE_ONE_SHOT);
       break;
     }
   }
 };
 
 function AboutWeaveLog() {}
 AboutWeaveLog.prototype = {
--- a/services/sync/modules/addonsreconciler.js
+++ b/services/sync/modules/addonsreconciler.js
@@ -287,23 +287,23 @@ AddonsReconciler.prototype = {
 
   /**
    * Removes a previously-installed change listener from the instance.
    *
    * @param listener
    *        Listener instance to remove.
    */
   removeChangeListener: function removeChangeListener(listener) {
-    this._listeners = this._listeners.filter(function(element) {
+    this._listeners = this._listeners.filter(element => {
       if (element == listener) {
         this._log.debug("Removing change listener.");
         return false;
       }
       return true;
-    }.bind(this));
+    });
   },
 
   /**
    * Tells the instance to start listening for AddonManager changes.
    *
    * This is typically called automatically when Sync is loaded.
    */
   startListening: function startListening() {
@@ -341,17 +341,17 @@ AddonsReconciler.prototype = {
    * Refreshes the global state of add-ons by querying the AddonManager.
    */
   refreshGlobalState: function refreshGlobalState(callback) {
     this._log.info("Refreshing global state from AddonManager.");
     this._ensureStateLoaded();
 
     let installs;
 
-    AddonManager.getAllAddons(function(addons) {
+    AddonManager.getAllAddons(addons => {
       let ids = {};
 
       for (let addon of addons) {
         ids[addon.id] = true;
         this.rectifyStateFromAddon(addon);
       }
 
       // Look for locally-defined add-ons that no longer exist and update their
@@ -394,17 +394,17 @@ AddonsReconciler.prototype = {
       }
 
       // See note for _shouldPersist.
       if (this._shouldPersist) {
         this.saveState(null, callback);
       } else {
         callback();
       }
-    }.bind(this));
+    });
   },
 
   /**
    * Rectifies the state of an add-on from an Addon instance.
    *
    * This basically says "given an Addon instance, assume it is truth and
    * apply changes to the local state to reflect it."
    *
--- a/services/sync/modules/addonutils.js
+++ b/services/sync/modules/addonutils.js
@@ -87,17 +87,17 @@ AddonUtilsInternal.prototype = {
    *        Object with additional metadata describing how to install add-on.
    * @param cb
    *        Function to be invoked with result of operation.
    */
   installAddonFromSearchResult:
     function installAddonFromSearchResult(addon, options, cb) {
     this._log.info("Trying to install add-on from search result: " + addon.id);
 
-    this.getInstallFromSearchResult(addon, function onResult(error, install) {
+    this.getInstallFromSearchResult(addon, (error, install) => {
       if (error) {
         cb(error, null);
         return;
       }
 
       if (!install) {
         cb(new Error("AddonInstall not available: " + addon.id), null);
         return;
@@ -144,17 +144,17 @@ AddonUtilsInternal.prototype = {
           }
         };
         install.addListener(listener);
         install.install();
       } catch (ex) {
         this._log.error("Error installing add-on", ex);
         cb(ex, null);
       }
-    }.bind(this));
+    });
   },
 
   /**
    * Uninstalls the Addon instance and invoke a callback when it is done.
    *
    * @param addon
    *        Addon instance to uninstall.
    * @param cb
@@ -230,17 +230,17 @@ AddonUtilsInternal.prototype = {
     }
 
     let ids = [];
     for (let addon of installs) {
       ids.push(addon.id);
     }
 
     AddonRepository.getAddonsByIDs(ids, {
-      searchSucceeded: function searchSucceeded(addons, addonsLength, total) {
+      searchSucceeded: (addons, addonsLength, total) => {
         this._log.info("Found " + addonsLength + "/" + ids.length +
                        " add-ons during repository search.");
 
         let ourResult = {
           installedIDs: [],
           installs:     [],
           addons:       [],
           skipped:      [],
@@ -337,17 +337,17 @@ AddonUtilsInternal.prototype = {
               options = install;
               break;
             }
           }
 
           this.installAddonFromSearchResult(addon, options, installCallback);
         }
 
-      }.bind(this),
+      },
 
       searchFailed: function searchFailed() {
         cb(new Error("AddonRepository search failed"), null);
       },
     });
   },
 
   /**
@@ -415,74 +415,74 @@ AddonUtilsInternal.prototype = {
    */
   updateUserDisabled: function updateUserDisabled(addon, value, cb) {
     if (addon.userDisabled == value) {
       cb(null, addon);
       return;
     }
 
     let listener = {
-      onEnabling: function onEnabling(wrapper, needsRestart) {
+      onEnabling: (wrapper, needsRestart) => {
         this._log.debug("onEnabling: " + wrapper.id);
         if (wrapper.id != addon.id) {
           return;
         }
 
         // We ignore the restartless case because we'll get onEnabled shortly.
         if (!needsRestart) {
           return;
         }
 
         AddonManager.removeAddonListener(listener);
         cb(null, wrapper);
-      }.bind(this),
+      },
 
-      onEnabled: function onEnabled(wrapper) {
+      onEnabled: wrapper => {
         this._log.debug("onEnabled: " + wrapper.id);
         if (wrapper.id != addon.id) {
           return;
         }
 
         AddonManager.removeAddonListener(listener);
         cb(null, wrapper);
-      }.bind(this),
+      },
 
-      onDisabling: function onDisabling(wrapper, needsRestart) {
+      onDisabling: (wrapper, needsRestart) => {
         this._log.debug("onDisabling: " + wrapper.id);
         if (wrapper.id != addon.id) {
           return;
         }
 
         if (!needsRestart) {
           return;
         }
 
         AddonManager.removeAddonListener(listener);
         cb(null, wrapper);
-      }.bind(this),
+      },
 
-      onDisabled: function onDisabled(wrapper) {
+      onDisabled: wrapper => {
         this._log.debug("onDisabled: " + wrapper.id);
         if (wrapper.id != addon.id) {
           return;
         }
 
         AddonManager.removeAddonListener(listener);
         cb(null, wrapper);
-      }.bind(this),
+      },
 
-      onOperationCancelled: function onOperationCancelled(wrapper) {
+      onOperationCancelled: wrapper => {
         this._log.debug("onOperationCancelled: " + wrapper.id);
         if (wrapper.id != addon.id) {
           return;
         }
 
         AddonManager.removeAddonListener(listener);
         cb(new Error("Operation cancelled"), wrapper);
-      }.bind(this)
+      }
     };
 
     // The add-on listeners are only fired if the add-on is active. If not, the
     // change is silently updated and made active when/if the add-on is active.
 
     if (!addon.appDisabled) {
       AddonManager.addAddonListener(listener);
     }
--- a/services/sync/modules/browserid_identity.js
+++ b/services/sync/modules/browserid_identity.js
@@ -785,17 +785,17 @@ BrowserIDClusterManager.prototype = {
 
     this._log.debug("Setting cluster to " + cluster);
     this.service.clusterURL = cluster;
 
     return true;
   },
 
   _findCluster() {
-    let endPointFromIdentityToken = function() {
+    let endPointFromIdentityToken = () => {
       // The only reason (in theory ;) that we can end up with a null token
       // is when this.identity._canFetchKeys() returned false.  In turn, this
       // should only happen if the master-password is locked or the credentials
       // storage is screwed, and in those cases we shouldn't have started
       // syncing so shouldn't get here anyway.
       // But better safe than sorry! To keep things clearer, throw an explicit
       // exception - the message will appear in the logs and the error will be
       // treated as transient.
@@ -806,35 +806,35 @@ BrowserIDClusterManager.prototype = {
       // For Sync 1.5 storage endpoints, we use the base endpoint verbatim.
       // However, it should end in "/" because we will extend it with
       // well known path components. So we add a "/" if it's missing.
       if (!endpoint.endsWith("/")) {
         endpoint += "/";
       }
       log.debug("_findCluster returning " + endpoint);
       return endpoint;
-    }.bind(this);
+    };
 
     // Spinningly ensure we are ready to authenticate and have a valid token.
-    let promiseClusterURL = function() {
+    let promiseClusterURL = () => {
       return this.identity.whenReadyToAuthenticate.promise.then(
         () => {
           // We need to handle node reassignment here.  If we are being asked
           // for a clusterURL while the service already has a clusterURL, then
           // it's likely a 401 was received using the existing token - in which
           // case we just discard the existing token and fetch a new one.
           if (this.service.clusterURL) {
             log.debug("_findCluster has a pre-existing clusterURL, so discarding the current token");
             this.identity._token = null;
           }
           return this.identity._ensureValidToken();
         }
       ).then(endPointFromIdentityToken
       );
-    }.bind(this);
+    };
 
     let cb = Async.makeSpinningCallback();
     promiseClusterURL().then(function(clusterURL) {
       cb(null, clusterURL);
     }).then(
       null, err => {
       log.info("Failed to fetch the cluster URL", err);
       // service.js's verifyLogin() method will attempt to fetch a cluster
--- a/services/sync/modules/resource.js
+++ b/services/sync/modules/resource.js
@@ -307,28 +307,28 @@ AsyncResource.prototype = {
     ret.headers = headers;
 
     if (!success) {
       this._log.warn(`${action} request to ${ret.url} failed with status ${status}`);
     }
     // Make a lazy getter to convert the json response into an object.
     // Note that this can cause a parse error to be thrown far away from the
     // actual fetch, so be warned!
-    XPCOMUtils.defineLazyGetter(ret, "obj", function() {
+    XPCOMUtils.defineLazyGetter(ret, "obj", () => {
       try {
         return JSON.parse(ret);
       } catch (ex) {
         this._log.warn("Got exception parsing response body", ex);
         // Stringify to avoid possibly printing non-printable characters.
         this._log.debug("Parse fail: Response body starts: \"" +
                         JSON.stringify((ret + "").slice(0, 100)) +
                         "\".");
         throw ex;
       }
-    }.bind(this));
+    });
 
     this._deferred.resolve(ret);
   },
 
   get() {
     return this._doRequest("GET", undefined);
   },
 
--- a/services/sync/modules/service.js
+++ b/services/sync/modules/service.js
@@ -320,28 +320,28 @@ Sync11Service.prototype = {
     let status = this._checkSetup();
     if (status != STATUS_DISABLED && status != CLIENT_NOT_CONFIGURED) {
       Svc.Obs.notify("weave:engine:start-tracking");
     }
 
     // Send an event now that Weave service is ready.  We don't do this
     // synchronously so that observers can import this module before
     // registering an observer.
-    Utils.nextTick(function onNextTick() {
+    Utils.nextTick(() => {
       this.status.ready = true;
 
       // UI code uses the flag on the XPCOM service so it doesn't have
       // to load a bunch of modules.
       let xps = Cc["@mozilla.org/weave/service;1"]
                   .getService(Ci.nsISupports)
                   .wrappedJSObject;
       xps.ready = true;
 
       Svc.Obs.notify("weave:service:ready");
-    }.bind(this));
+    });
   },
 
   _checkSetup: function _checkSetup() {
     if (!this.enabled) {
       return this.status.service = STATUS_DISABLED;
     }
     return this.status.checkSetup();
   },
--- a/services/sync/tps/extensions/tps/resource/tps.jsm
+++ b/services/sync/tps/extensions/tps/resource/tps.jsm
@@ -291,20 +291,20 @@ var TPS = {
     this.goQuitApplication();
   },
 
   HandleWindows(aWindow, action) {
     Logger.logInfo("executing action " + action.toUpperCase() +
                    " on window " + JSON.stringify(aWindow));
     switch (action) {
       case ACTION_ADD:
-        BrowserWindows.Add(aWindow.private, function(win) {
+        BrowserWindows.Add(aWindow.private, win => {
           Logger.logInfo("window finished loading");
           this.FinishAsyncOperation();
-        }.bind(this));
+        });
         break;
     }
     Logger.logPass("executing action " + action.toUpperCase() + " on windows");
   },
 
   HandleTabs(tabs, action) {
     this._tabsAdded = tabs.length;
     this._tabsFinished = 0;
--- a/testing/mochitest/browser-test.js
+++ b/testing/mochitest/browser-test.js
@@ -162,17 +162,17 @@ function Tester(aTests, structuredLogger
   this.SimpleTestOriginal = {};
   SIMPLETEST_OVERRIDES.forEach(m => {
     this.SimpleTestOriginal[m] = this.SimpleTest[m];
   });
 
   this._coverageCollector = null;
 
   this._toleratedUncaughtRejections = null;
-  this._uncaughtErrorObserver = function({message, date, fileName, stack, lineNumber}) {
+  this._uncaughtErrorObserver = ({message, date, fileName, stack, lineNumber}) => {
     let error = message;
     if (fileName || lineNumber) {
       error = {
         fileName: fileName,
         lineNumber: lineNumber,
         message: message,
         toString: function() {
           return message;
@@ -190,17 +190,17 @@ function Tester(aTests, structuredLogger
 
     this.currentTest.addResult(
       new testResult(
 	      /*success*/tolerate,
         /*name*/name,
         /*error*/error,
         /*known*/tolerate,
         /*stack*/stack));
-    }.bind(this);
+    };
 }
 Tester.prototype = {
   EventUtils: {},
   SimpleTest: {},
   Task: null,
   ContentTask: null,
   ExtensionTestUtils: null,
   Assert: null,
@@ -576,17 +576,17 @@ Tester.prototype = {
       this.ContentTask.setTestScope(null);
       testScope.destroy();
       this.currentTest.scope = null;
     }
 
     // Check the window state for the current test before moving to the next one.
     // This also causes us to check before starting any tests, since nextTest()
     // is invoked to start the tests.
-    this.waitForWindowsState((function () {
+    this.waitForWindowsState(() => {
       if (this.done) {
         if (this._coverageCollector) {
           this._coverageCollector.finalize();
         }
 
         // Uninitialize a few things explicitly so that they can clean up
         // frames and browser intentionally kept alive until shutdown to
         // eliminate false positives.
@@ -665,17 +665,17 @@ Tester.prototype = {
           });
         });
 
         return;
       }
 
       this.currentTestIndex++;
       this.execTest();
-    }).bind(this));
+    });
   }),
 
   execTest: function Tester_execTest() {
     this.structuredLogger.testStart(this.currentTest.path);
 
     this.SimpleTest.reset();
 
     // Load the tests into a testscope
--- a/testing/specialpowers/content/MockColorPicker.jsm
+++ b/testing/specialpowers/content/MockColorPicker.jsm
@@ -85,17 +85,17 @@ MockColorPickerInstance.prototype = {
     this.initialColor = aInitialColor;
   },
   initialColor: "",
   parent: null,
   open: function(aColorPickerShownCallback) {
     MockColorPicker.showing = true;
     MockColorPicker.shown = true;
 
-    this.window.setTimeout(function() {
+    this.window.setTimeout(() => {
       let result = "";
       try {
         if (typeof MockColorPicker.showCallback == "function") {
           var updateCb = function(color) {
             result = color;
             aColorPickerShownCallback.update(color);
           };
           let returnColor = MockColorPicker.showCallback(this, updateCb);
@@ -107,11 +107,11 @@ MockColorPickerInstance.prototype = {
         }
       } catch(ex) {
         dump("TEST-UNEXPECTED-FAIL | Exception in MockColorPicker.jsm open() " +
              "method: " + ex + "\n");
       }
       if (aColorPickerShownCallback) {
         aColorPickerShownCallback.done(result);
       }
-    }.bind(this), 0);
+    }, 0);
   }
 };
--- a/testing/xpcshell/node-http2/lib/protocol/flow.js
+++ b/testing/xpcshell/node-http2/lib/protocol/flow.js
@@ -82,23 +82,23 @@ Flow.prototype._receive = function _rece
 Flow.prototype._write = function _write(frame, encoding, callback) {
   var sentToUs = (this._flowControlId === undefined) || (frame.stream === this._flowControlId);
 
   if (sentToUs && (frame.flags.END_STREAM || (frame.type === 'RST_STREAM'))) {
     this._ended = true;
   }
 
   if ((frame.type === 'DATA') && (frame.data.length > 0)) {
-    this._receive(frame, function() {
+    this._receive(frame, () => {
       this._received += frame.data.length;
       if (!this._restoreWindowTimer) {
         this._restoreWindowTimer = setImmediate(this._restoreWindow.bind(this));
       }
       callback();
-    }.bind(this));
+    });
   }
 
   else {
     this._receive(frame, callback);
   }
 
   if (sentToUs && (frame.type === 'WINDOW_UPDATE')) {
     this._updateWindow(frame);
--- a/testing/xpcshell/node-http2/test/flow.js
+++ b/testing/xpcshell/node-http2/test/flow.js
@@ -224,25 +224,25 @@ describe('flow.js', function() {
           if (frame.type === 'DATA') {
             expect(frame.data.length).to.be.lte(MAX_PAYLOAD_SIZE);
             output.push(frame.data);
           }
           if (frame.flags.END_STREAM) {
             this.emit('end_stream');
           }
           if (frame.type === 'BLOCKED') {
-            setTimeout(function() {
+            setTimeout(() => {
               this._push({
                 type: 'WINDOW_UPDATE',
                 flags: {},
                 stream: this._flowControlId,
                 window_size: this._received
               });
               this._received = 0;
-            }.bind(this), 20);
+            }, 20);
           }
           callback();
         };
 
         // Checking results
         flow2.on('end_stream', function() {
           input = util.concat(input);
           output = util.concat(output);
--- a/toolkit/components/asyncshutdown/AsyncShutdown.jsm
+++ b/toolkit/components/asyncshutdown/AsyncShutdown.jsm
@@ -914,17 +914,17 @@ Barrier.prototype = Object.freeze({
       // If after |crashAfterMS| milliseconds (adjusted to take into
       // account sleep and otherwise busy computer) we have not finished
       // this shutdown phase, we assume that the shutdown is somehow
       // frozen, presumably deadlocked. At this stage, the only thing we
       // can do to avoid leaving the user's computer in an unstable (and
       // battery-sucking) situation is report the issue and crash.
       timeToCrash = looseTimer(crashAfterMS);
       timeToCrash.promise.then(
-        function onTimeout() {
+        () => {
           // Report the problem as best as we can, then crash.
           let state = this.state;
 
           // If you change the following message, please make sure
           // that any information on the topic and state appears
           // within the first 200 characters of the message. This
           // helps automatically sort oranges.
           let msg = "AsyncShutdown timeout in " + topic +
@@ -952,17 +952,17 @@ Barrier.prototype = Object.freeze({
           // which have been determined during the call to `addBlocker`.
           let filename = "?";
           let lineNumber = -1;
           for (let blocker of this._promiseToBlocker.values()) {
             ({filename, lineNumber} = blocker.getOrigin());
             break;
           }
           gDebug.abort(filename, lineNumber);
-        }.bind(this),
+        },
         function onSatisfied() {
           // The promise has been rejected, which means that we have satisfied
           // all completion conditions.
         });
 
       promise = promise.then(function() {
         timeToCrash.reject();
       }/* No error is possible here*/);
--- a/toolkit/components/crashes/CrashManager.jsm
+++ b/toolkit/components/crashes/CrashManager.jsm
@@ -815,29 +815,29 @@ this.CrashManager.prototype = Object.fre
         // store. Since the store takes up resources, we automatically "free"
         // the store after inactivity so resources can be returned to the
         // system. We do this via a timer and a mechanism that tracks when the
         // store is being accessed.
         this._storeTimer.cancel();
 
         // This callback frees resources from the store unless the store
         // is protected from freeing by some other process.
-        let timerCB = function() {
+        let timerCB = () => {
           if (this._storeProtectedCount) {
             this._storeTimer.initWithCallback(timerCB, this.STORE_EXPIRATION_MS,
                                               this._storeTimer.TYPE_ONE_SHOT);
             return;
           }
 
           // We kill the reference that we hold. GC will kill it later. If
           // someone else holds a reference, that will prevent GC until that
           // reference is gone.
           this._store = null;
           this._storeTimer = null;
-        }.bind(this);
+        };
 
         this._storeTimer.initWithCallback(timerCB, this.STORE_EXPIRATION_MS,
                                           this._storeTimer.TYPE_ONE_SHOT);
 
         return this._store;
       } finally {
         this._getStoreTask = null;
       }
--- a/toolkit/components/ctypes/tests/unit/head.js
+++ b/toolkit/components/ctypes/tests/unit/head.js
@@ -20,25 +20,25 @@ function ResourceCleaner() {
 }
 ResourceCleaner.prototype = {
   add: function ResourceCleaner_add(v) {
     this._map.set(v);
     return v;
   },
   cleanup: function ResourceCleaner_cleanup() {
     let keys = ThreadSafeChromeUtils.nondeterministicGetWeakMapKeys(this._map);
-    keys.forEach((function cleaner(k) {
+    keys.forEach(k => {
       try {
         k.dispose();
       } catch (x) {
         // This can fail if |forget|/|dispose| has been called manually
         // during the test. This is normal.
       }
       this._map.delete(k);
-    }).bind(this));
+    });
   }
 };
 
 /**
  * Simple wrapper for tests that require cleanup.
  */
 function ResourceTester(start, stop) {
   this._start = start;
--- a/toolkit/components/jsdownloads/src/DownloadLegacy.js
+++ b/toolkit/components/jsdownloads/src/DownloadLegacy.js
@@ -228,31 +228,31 @@ DownloadLegacyTransfer.prototype = {
     Downloads.createDownload({
       source: { url: aSource.spec, isPrivate: aIsPrivate },
       target: { path: aTarget.QueryInterface(Ci.nsIFileURL).file.path,
                 partFilePath: aTempFile && aTempFile.path },
       saver: "legacy",
       launchWhenSucceeded,
       contentType,
       launcherPath
-    }).then(function DLT_I_onDownload(aDownload) {
+    }).then(aDownload => {
       // Legacy components keep partial data when they use a ".part" file.
       if (aTempFile) {
         aDownload.tryToKeepPartialData = true;
       }
 
       // Start the download before allowing it to be controlled.  Ignore errors.
       aDownload.start().catch(() => {});
 
       // Start processing all the other events received through nsITransfer.
       this._deferDownload.resolve(aDownload);
 
       // Add the download to the list, allowing it to be seen and canceled.
       return Downloads.getList(Downloads.ALL).then(list => list.add(aDownload));
-    }.bind(this)).then(null, Cu.reportError);
+    }).then(null, Cu.reportError);
   },
 
   setSha256Hash(hash) {
     this._sha256Hash = hash;
   },
 
   setSignatureInfo(signatureInfo) {
     this._signatureInfo = signatureInfo;
--- a/toolkit/components/places/BookmarkJSONUtils.jsm
+++ b/toolkit/components/places/BookmarkJSONUtils.jsm
@@ -263,17 +263,17 @@ BookmarkImporter.prototype = {
           return 1;
         if (bNode.root && bNode.root == "tagsFolder")
           return -1;
         return 0;
       });
 
       let batch = {
         nodes: nodes[0].children,
-        runBatched: function runBatched() {
+        runBatched: () => {
           if (this._replace) {
             // Get roots excluded from the backup, we will not remove them
             // before restoring.
             let excludeItems = PlacesUtils.annotations.getItemsWithAnnotation(
                                  PlacesUtils.EXCLUDE_FROM_BACKUP_ANNO);
             // Delete existing children of the root node, excepting:
             // 1. special folders: delete the child nodes
             // 2. tags folder: untag via the tagging api
@@ -354,17 +354,17 @@ BookmarkImporter.prototype = {
             let oldURI = PlacesUtils.bookmarks.getBookmarkURI(id);
             let uri = fixupQuery(oldURI, folderIdMap);
             if (!uri.equals(oldURI)) {
               PlacesUtils.bookmarks.changeBookmarkURI(id, uri, this._source);
             }
           }
 
           deferred.resolve();
-        }.bind(this)
+        }
       };
 
       PlacesUtils.bookmarks.runInBatchMode(batch, null);
     }
     yield deferred.promise;
     // TODO (bug 1095426) once converted to the new bookmarks API, methods will
     // yield, so this hack should not be needed anymore.
     try {
--- a/toolkit/components/places/PlacesBackups.jsm
+++ b/toolkit/components/places/PlacesBackups.jsm
@@ -187,17 +187,17 @@ this.PlacesBackups = {
     return Task.spawn(function* () {
       if (this._backupFiles)
         return this._backupFiles;
 
       this._backupFiles = [];
 
       let backupFolderPath = yield this.getBackupFolder();
       let iterator = new OS.File.DirectoryIterator(backupFolderPath);
-      yield iterator.forEach(function(aEntry) {
+      yield iterator.forEach(aEntry => {
         // Since this is a lazy getter and OS.File I/O is serialized, we can
         // safely remove .tmp files without risking to remove ongoing backups.
         if (aEntry.name.endsWith(".tmp")) {
           OS.File.remove(aEntry.path);
           return undefined;
         }
 
         if (filenamesRegex.test(aEntry.name)) {
@@ -205,17 +205,17 @@ this.PlacesBackups = {
           let filePath = aEntry.path;
           if (this.getDateForFile(filePath) > new Date()) {
             return OS.File.remove(filePath);
           }
           this._backupFiles.push(filePath);
         }
 
         return undefined;
-      }.bind(this));
+      });
       iterator.close();
 
       this._backupFiles.sort((a, b) => {
         let aDate = this.getDateForFile(a);
         let bDate = this.getDateForFile(b);
         return bDate - aDate;
       });
 
--- a/toolkit/components/places/nsPlacesExpiration.js
+++ b/toolkit/components/places/nsPlacesExpiration.js
@@ -622,33 +622,33 @@ nsPlacesExpiration.prototype = {
   onDeleteURI() {},
   onPageChanged() {},
   onDeleteVisits() {},
 
   // nsITimerCallback
 
   notify: function PEX_timerCallback() {
     // Check if we are over history capacity, if so visits must be expired.
-    this._getPagesStats((function onPagesCount(aPagesCount, aStatsCount) {
+    this._getPagesStats((aPagesCount, aStatsCount) => {
       let overLimitPages = aPagesCount - this._urisLimit;
       this._overLimit = overLimitPages > 0;
 
       let action = this._overLimit ? ACTION.TIMED_OVERLIMIT : ACTION.TIMED;
       // If the number of pages changed significantly from the last ANALYZE
       // update SQLite statistics.
       if (Math.abs(aPagesCount - aStatsCount) >= ANALYZE_PAGES_THRESHOLD) {
         action = action | ACTION.TIMED_ANALYZE;
       }
 
       // Adapt expiration aggressivity to the number of pages over the limit.
       let limit = overLimitPages > OVERLIMIT_PAGES_THRESHOLD ? LIMIT.LARGE
                                                              : LIMIT.SMALL;
 
       this._expireWithActionAndLimit(action, limit);
-    }).bind(this));
+    });
   },
 
   // mozIStorageStatementCallback
 
   handleResult: function PEX_handleResult(aResultSet) {
     // We don't want to notify after shutdown.
     if (this._shuttingDown)
       return;
--- a/toolkit/components/places/tests/bookmarks/test_sync_fields.js
+++ b/toolkit/components/places/tests/bookmarks/test_sync_fields.js
@@ -122,22 +122,22 @@ class TestCases {
     await checkSyncFields(guid, { syncChangeCounter: 5 });
 
     await this.removeKeyword(guid, "keyword");
     do_print(`Removed keyword from bookmark ${guid}`);
     await checkSyncFields(guid, { syncChangeCounter: 6 });
   }
 
   async testSeparators() {
-    let insertSyncedBookmark = async function(uri) {
+    let insertSyncedBookmark = async uri => {
       return await this.insertBookmark(PlacesUtils.bookmarks.unfiledGuid,
                                            NetUtil.newURI(uri),
                                            PlacesUtils.bookmarks.DEFAULT_INDEX,
                                            "A bookmark name");
-    }.bind(this);
+    };
 
     await insertSyncedBookmark("http://foo.bar");
     let secondBmk = await insertSyncedBookmark("http://bar.foo");
     let sepGuid = await this.insertSeparator(PlacesUtils.bookmarks.unfiledGuid, PlacesUtils.bookmarks.DEFAULT_INDEX);
     await insertSyncedBookmark("http://barbar.foo");
 
     do_print("Move a bookmark around the separator");
     await this.moveItem(secondBmk, PlacesUtils.bookmarks.unfiledGuid, 4);
--- a/toolkit/components/reader/AboutReader.jsm
+++ b/toolkit/components/reader/AboutReader.jsm
@@ -825,30 +825,30 @@ AboutReader.prototype = {
   },
 
   _hideContent() {
     this._headerElement.style.display = "none";
     this._contentElement.style.display = "none";
   },
 
   _showProgressDelayed() {
-    this._win.setTimeout(function() {
+    this._win.setTimeout(() => {
       // No need to show progress if the article has been loaded,
       // if the window has been unloaded, or if there was an error
       // trying to load the article.
       if (this._article || this._windowUnloaded || this._error) {
         return;
       }
 
       this._headerElement.style.display = "none";
       this._contentElement.style.display = "none";
 
       this._messageElement.textContent = gStrings.GetStringFromName("aboutReader.loading2");
       this._messageElement.style.display = "block";
-    }.bind(this), 300);
+    }, 300);
   },
 
   /**
    * Returns the original article URL for this about:reader view.
    */
   _getOriginalUrl(win) {
     let url = win ? win.location.href : this._win.location.href;
     return ReaderMode.getOriginalUrl(url) || url;
--- a/toolkit/components/reader/Readability.js
+++ b/toolkit/components/reader/Readability.js
@@ -1561,17 +1561,17 @@ Readability.prototype = {
     if (this._curPageNum > this._maxPages) {
       var nextPageMarkup = "<div style='text-align: center'><a href='" + nextPageLink + "'>View Next Page</a></div>";
       articlePage.innerHTML = articlePage.innerHTML + nextPageMarkup;
       return;
     }
 
     // Now that we've built the article page DOM element, get the page content
     // asynchronously and load the cleaned content into the div we created for it.
-    (function(pageUrl, thisPage) {
+    ((pageUrl, thisPage) => {
       this._ajax(pageUrl, {
         success: function(r) {
 
           // First, check to see if we have a matching ETag in headers - if we do, this is a duplicate page.
           var eTag = r.getResponseHeader('ETag');
           if (eTag) {
             if (eTag in this._pageETags) {
               this.log("Exact duplicate page found via ETag. Aborting.");
@@ -1633,26 +1633,26 @@ Readability.prototype = {
 
           this._removeScripts(content);
 
           thisPage.innerHTML = thisPage.innerHTML + content.innerHTML;
 
           // After the page has rendered, post process the content. This delay is necessary because,
           // in webkit at least, offsetWidth is not set in time to determine image width. We have to
           // wait a little bit for reflow to finish before we can fix floating images.
-          setTimeout((function() {
+          setTimeout(() => {
             this._postProcessContent(thisPage);
-          }).bind(this), 500);
+          }, 500);
 
 
           if (secondNextPageLink)
             this._appendNextPage(secondNextPageLink);
         }
       });
-    }).bind(this)(nextPageLink, articlePage);
+    })(nextPageLink, articlePage);
   },
 
   /**
    * Get an elements class/id weight. Uses regular expressions to tell if this
    * element looks good or bad.
    *
    * @param Element
    * @return number (Integer)
--- a/toolkit/components/search/nsSearchService.js
+++ b/toolkit/components/search/nsSearchService.js
@@ -3262,20 +3262,20 @@ SearchService.prototype = {
       } catch (ex) {}
     }
     return json;
   }),
 
   _batchTask: null,
   get batchTask() {
     if (!this._batchTask) {
-      let task = function taskCallback() {
+      let task = () => {
         LOG("batchTask: Invalidating engine cache");
         this._buildCache();
-      }.bind(this);
+      };
       this._batchTask = new DeferredTask(task, CACHE_INVALIDATION_DELAY);
     }
     return this._batchTask;
   },
 
   _addEngineToStore: function SRCH_SVC_addEngineToStore(aEngine) {
     LOG("_addEngineToStore: Adding engine: \"" + aEngine.name + "\"");
 
--- a/toolkit/components/search/nsSearchSuggestions.js
+++ b/toolkit/components/search/nsSearchSuggestions.js
@@ -140,23 +140,23 @@ SuggestAutoComplete.prototype = {
 
     // Start search immediately if possible, otherwise once the search
     // service is initialized
     if (Services.search.isInitialized) {
       this._triggerSearch(searchString, formHistorySearchParam, listener, privacyMode);
       return;
     }
 
-    Services.search.init((function startSearch_cb(aResult) {
+    Services.search.init(aResult => {
       if (!Components.isSuccessCode(aResult)) {
         Cu.reportError("Could not initialize search service, bailing out: " + aResult);
         return;
       }
       this._triggerSearch(searchString, formHistorySearchParam, listener, privacyMode);
-    }).bind(this));
+    });
   },
 
   /**
    * Actual implementation of search.
    */
   _triggerSearch(searchString, searchParam, listener, privacyMode) {
     this._listener = listener;
     this._suggestionController.fetch(searchString,
--- a/toolkit/components/telemetry/TelemetrySession.jsm
+++ b/toolkit/components/telemetry/TelemetrySession.jsm
@@ -1498,17 +1498,17 @@ var Impl = {
   /**
    * Does the "heavy" Telemetry initialization later on, so we
    * don't impact startup performance.
    * @return {Promise} Resolved when the initialization completes.
    */
   delayedInit() {
     this._log.trace("delayedInit");
 
-    this._delayedInitTask = (async function() {
+    this._delayedInitTask = (async () => {
       try {
         this._initialized = true;
 
         await this._loadSessionData();
         // Update the session data to keep track of new subsessions created before
         // the initialization.
         await TelemetryStorage.saveSessionData(this._getSessionDataObject());
 
@@ -1543,17 +1543,17 @@ var Impl = {
           TelemetryScheduler.init();
         }
 
         this._delayedInitTask = null;
       } catch (e) {
         this._delayedInitTask = null;
         throw e;
       }
-    }.bind(this))();
+    })();
 
     return this._delayedInitTask;
   },
 
   getOpenTabsCount: function getOpenTabsCount() {
     let tabCount = 0;
 
     let browserEnum = Services.wm.getEnumerator("navigator:browser");
@@ -2005,25 +2005,25 @@ var Impl = {
       }
       this.uninstall();
 
       let reset = () => {
         this._initStarted = false;
         this._initialized = false;
       };
 
-      return (async function() {
+      return (async () => {
         await this.saveShutdownPings();
 
         if (IS_UNIFIED_TELEMETRY) {
           await TelemetryController.removeAbortedSessionPing();
         }
 
         reset();
-      }.bind(this))();
+      })();
     };
 
     // We can be in one the following states here:
     // 1) delayedInit was never called
     // or it was called and
     //   2) _delayedInitTask is running now.
     //   3) _delayedInitTask finished running already.
 
--- a/toolkit/components/telemetry/TelemetryStorage.jsm
+++ b/toolkit/components/telemetry/TelemetryStorage.jsm
@@ -1730,28 +1730,28 @@ var TelemetryStorageImpl = {
       } else {
         this._log.error("loadAbortedSessionPing - error loading ping", ex)
       }
     }
     return ping;
   },
 
   removeAbortedSessionPing() {
-    return this._abortedSessionSerializer.enqueueTask(async function() {
+    return this._abortedSessionSerializer.enqueueTask(async () => {
       try {
         await OS.File.remove(gAbortedSessionFilePath, { ignoreAbsent: false });
         this._log.trace("removeAbortedSessionPing - success");
       } catch (ex) {
         if (ex.becauseNoSuchFile) {
           this._log.trace("removeAbortedSessionPing - no such file");
         } else {
           this._log.error("removeAbortedSessionPing - error removing ping", ex)
         }
       }
-    }.bind(this));
+    });
   },
 
   /**
    * Save the deletion ping.
    * @param ping The deletion ping.
    * @return {Promise} Resolved when the ping is saved.
    */
   async saveDeletionPing(ping) {
@@ -1764,28 +1764,28 @@ var TelemetryStorageImpl = {
     return p;
   },
 
   /**
    * Remove the deletion ping.
    * @return {Promise} Resolved when the ping is deleted from the disk.
    */
   async removeDeletionPing() {
-    return this._deletionPingSerializer.enqueueTask(async function() {
+    return this._deletionPingSerializer.enqueueTask(async () => {
       try {
         await OS.File.remove(gDeletionPingFilePath, { ignoreAbsent: false });
         this._log.trace("removeDeletionPing - success");
       } catch (ex) {
         if (ex.becauseNoSuchFile) {
           this._log.trace("removeDeletionPing - no such file");
         } else {
           this._log.error("removeDeletionPing - error removing ping", ex)
         }
       }
-    }.bind(this));
+    });
   },
 
   isDeletionPing(aPingId) {
     let pingInfo = this._pendingPings.get(aPingId);
     if (!pingInfo) {
       return false;
     }
 
--- a/toolkit/components/thumbnails/PageThumbs.jsm
+++ b/toolkit/components/thumbnails/PageThumbs.jsm
@@ -827,19 +827,19 @@ var PageThumbsExpiration = {
     if (index > -1)
       this._filters.splice(index, 1);
   },
 
   notify: function Expiration_notify(aTimer) {
     let urls = [];
     let filtersToWaitFor = this._filters.length;
 
-    let expire = function expire() {
+    let expire = () => {
       this.expireThumbnails(urls);
-    }.bind(this);
+    };
 
     // No registered filters.
     if (!filtersToWaitFor) {
       expire();
       return;
     }
 
     function filterCallback(aURLs) {
--- a/toolkit/components/thumbnails/test/head.js
+++ b/toolkit/components/thumbnails/test/head.js
@@ -38,24 +38,24 @@ function test() {
  */
 var TestRunner = {
   /**
    * Starts the test runner.
    */
   run() {
     waitForExplicitFinish();
 
-    SessionStore.promiseInitialized.then(function() {
+    SessionStore.promiseInitialized.then(() => {
       this._iter = runTests();
       if (this._iter) {
         this.next();
       } else {
         finish();
       }
-    }.bind(this));
+    });
   },
 
   /**
    * Runs the next available test or finishes if there's no test left.
    * @param aValue This value will be passed to the yielder via the runner's
    *               iterator.
    */
   next(aValue) {
--- a/toolkit/content/widgets/videocontrols.xml
+++ b/toolkit/content/widgets/videocontrols.xml
@@ -1544,21 +1544,21 @@
 
         const label = tt.label || "";
         const ttText = document.createTextNode(label);
         const ttBtn = document.createElement("button");
 
         ttBtn.classList.add("textTrackItem");
         ttBtn.setAttribute("index", tt.index);
 
-        ttBtn.addEventListener("click", function(event) {
+        ttBtn.addEventListener("click", event => {
           event.stopPropagation();
 
           this.changeTextTrack(tt.index);
-        }.bind(this));
+        });
 
         ttBtn.appendChild(ttText);
 
         this.textTrackList.appendChild(ttBtn);
 
         if (tt.mode === "showing" && tt.index) {
           this.changeTextTrack(tt.index);
         }
--- a/toolkit/modules/PropertyListUtils.jsm
+++ b/toolkit/modules/PropertyListUtils.jsm
@@ -85,17 +85,17 @@ this.PropertyListUtils = Object.freeze({
   read: function PLU_read(aFile, aCallback) {
     if (!(aFile instanceof Ci.nsILocalFile || aFile instanceof File))
       throw new Error("aFile is not a file object");
     if (typeof(aCallback) != "function")
       throw new Error("Invalid value for aCallback");
 
     // We guarantee not to throw directly for any other exceptions, and always
     // call aCallback.
-    Services.tm.dispatchToMainThread(function() {
+    Services.tm.dispatchToMainThread(() => {
       let self = this;
       function readDOMFile(aFile) {
         let fileReader = new FileReader();
         let onLoadEnd = function() {
           let root = null;
           try {
             fileReader.removeEventListener("loadend", onLoadEnd);
             if (fileReader.readyState != fileReader.DONE)
@@ -121,17 +121,17 @@ this.PropertyListUtils = Object.freeze({
           });
           return;
         }
         readDOMFile(aFile);
       } catch (ex) {
         aCallback(null);
         throw ex;
       }
-    }.bind(this));
+    });
   },
 
   /**
    * DO NOT USE ME.  Once Bug 718189 is fixed, this method won't be public.
    *
    * Synchronously read an ArrayBuffer contents as a property list.
    */
   _readFromArrayBufferSync: function PLU__readFromArrayBufferSync(aBuffer) {
--- a/toolkit/modules/Sntp.jsm
+++ b/toolkit/modules/Sntp.jsm
@@ -169,26 +169,25 @@ Sntp.prototype = {
       return String.fromCharCode.apply(null, new Uint8Array(buffer));
     }
 
     function SNTPListener() {}
     SNTPListener.prototype = {
       onStartRequest: function onStartRequest(request, context) {
       },
 
-      onStopRequest: function onStopRequest(request, context, status) {
+      onStopRequest: (request, context, status) => {
         if (!Components.isSuccessCode(status)) {
           debug("Connection failed");
           this._requesting = false;
           this._retry();
         }
-      }.bind(this),
+      },
 
-      onDataAvailable: function onDataAvailable(request, context, inputStream,
-                                                offset, count) {
+      onDataAvailable: (request, context, inputStream, offset, count) => {
         function GetTimeStamp(binaryInputStream) {
           let s = binaryInputStream.read32();
           let f = binaryInputStream.read32();
           return Math.floor(
             ((s - OFFSET_1900_TO_1970) * 1000) + ((f * 1000) / 0x100000000)
           );
         }
         debug("Data available: " + count + " bytes");
@@ -213,33 +212,33 @@ Sntp.prototype = {
                            transmitTimeInMS, respondTimeInMS);
           this._requesting = false;
         } catch (e) {
           debug("SNTPListener Error: " + e.message);
           this._requesting = false;
           this._retry();
         }
         inputStream.close();
-      }.bind(this)
+      }
     };
 
     function SNTPRequester() {}
     SNTPRequester.prototype = {
-      onOutputStreamReady: function(stream) {
+      onOutputStreamReady: stream => {
         try {
           let data = GetRequest();
           let bytes_write = stream.write(data, data.length);
           debug("SNTP: sent " + bytes_write + " bytes");
           stream.close();
         } catch (e) {
           debug("SNTPRequester Error: " + e.message);
           this._requesting = false;
           this._retry();
         }
-      }.bind(this)
+      }
     };
 
     // Number of seconds between Jan 1, 1900 and Jan 1, 1970.
     // 70 years plus 17 leap days.
     let OFFSET_1900_TO_1970 = ((365 * 70) + 17) * 24 * 60 * 60;
 
     if (this._requesting) {
       return;
--- a/toolkit/modules/secondscreen/RokuApp.jsm
+++ b/toolkit/modules/secondscreen/RokuApp.jsm
@@ -34,54 +34,54 @@ RokuApp.prototype = {
     // We have no way to know if the app is running, so just return "unknown"
     // but we use this call to fetch the mediaAppID for the given app name
     let url = this.resourceURL + "query/apps";
     let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
     xhr.open("GET", url, true);
     xhr.channel.loadFlags |= Ci.nsIRequest.INHIBIT_CACHING;
     xhr.overrideMimeType("text/xml");
 
-    xhr.addEventListener("load", (function() {
+    xhr.addEventListener("load", () => {
       if (xhr.status == 200) {
         let doc = xhr.responseXML;
         let apps = doc.querySelectorAll("app");
         for (let app of apps) {
           if (app.textContent == this.app) {
             this.mediaAppID = app.id;
           }
         }
       }
 
       // Since ECP has no way of telling us if an app is running, we always return "unknown"
       if (callback) {
         callback({ state: "unknown" });
       }
-    }).bind(this));
+    });
 
     xhr.addEventListener("error", (function() {
       if (callback) {
         callback({ state: "unknown" });
       }
     }));
 
     xhr.send(null);
   },
 
   start: function start(callback) {
     // We need to make sure we have cached the mediaAppID
     if (this.mediaAppID == -1) {
-      this.status(function() {
+      this.status(() => {
         // If we found the mediaAppID, use it to make a new start call
         if (this.mediaAppID != -1) {
           this.start(callback);
         } else {
           // We failed to start the app, so let the caller know
           callback(false);
         }
-      }.bind(this));
+      });
       return;
     }
 
     // Start a given app with any extra query data. Each app uses it's own data scheme.
     // NOTE: Roku will also pass "source=external-control" as a param
     let url = this.resourceURL + "launch/" + this.mediaAppID + "?version=" + parseInt(PROTOCOL_VERSION);
     let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
     xhr.open("POST", url, true);
--- a/toolkit/modules/secondscreen/SimpleServiceDiscovery.jsm
+++ b/toolkit/modules/secondscreen/SimpleServiceDiscovery.jsm
@@ -348,30 +348,30 @@ var SimpleServiceDiscovery = {
 
   _processService: function _processService(aService) {
     // Use the REST api to request more information about this service
     let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
     xhr.open("GET", aService.location, true);
     xhr.channel.loadFlags |= Ci.nsIRequest.INHIBIT_CACHING;
     xhr.overrideMimeType("text/xml");
 
-    xhr.addEventListener("load", (function() {
+    xhr.addEventListener("load", () => {
       if (xhr.status == 200) {
         let doc = xhr.responseXML;
         aService.appsURL = xhr.getResponseHeader("Application-URL");
         if (aService.appsURL && !aService.appsURL.endsWith("/"))
           aService.appsURL += "/";
         aService.friendlyName = doc.querySelector("friendlyName").textContent;
         aService.uuid = doc.querySelector("UDN").textContent;
         aService.manufacturer = doc.querySelector("manufacturer").textContent;
         aService.modelName = doc.querySelector("modelName").textContent;
 
         this.addService(aService);
       }
-    }).bind(this));
+    });
 
     xhr.send(null);
   },
 
   // Add a service to the WeakMap, even if one already exists with this id.
   // Returns true if this succeeded or false if it failed
   _addService(service) {
     // Filter out services that do not match the device filter
--- a/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
+++ b/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
@@ -656,17 +656,17 @@ xhr.prototype = {
   },
   abort() {
     this._dropRequest = true;
     this._notify(["abort", "loadend"]);
   },
   responseXML: null,
   responseText: null,
   send(aBody) {
-    do_execute_soon(function() {
+    do_execute_soon(() => {
       try {
         if (this._options.dropRequest) {
           if (this._timeout > 0 && this._options.timeout) {
             this._notify(["timeout", "loadend"]);
           }
           return;
         }
         this.status = this.inputStatus;
@@ -682,17 +682,17 @@ xhr.prototype = {
         if (this.inputStatus === 200) {
           this._notify(["load", "loadend"]);
         } else {
           this._notify(["error", "loadend"]);
         }
       } catch (ex) {
         do_throw(ex);
       }
-    }.bind(this));
+    });
   },
   set onabort(aValue) { this._onabort = makeHandler(aValue); },
   get onabort() { return this._onabort; },
   set onprogress(aValue) { this._onprogress = makeHandler(aValue); },
   get onprogress() { return this._onprogress; },
   set onerror(aValue) { this._onerror = makeHandler(aValue); },
   get onerror() { return this._onerror; },
   set onload(aValue) { this._onload = makeHandler(aValue); },
--- a/toolkit/mozapps/downloads/nsHelperAppDlg.js
+++ b/toolkit/mozapps/downloads/nsHelperAppDlg.js
@@ -304,17 +304,17 @@ nsUnknownContentTypeDialog.prototype = {
       picker.appendFilters( nsIFilePicker.filterAll );
 
       // Default to lastDir if it is valid, otherwise use the user's default
       // downloads directory.  getPreferredDownloadsDirectory should always
       // return a valid directory path, so we can safely default to it.
       let preferredDir = yield Downloads.getPreferredDownloadsDirectory();
       picker.displayDirectory = new FileUtils.File(preferredDir);
 
-      gDownloadLastDir.getFileAsync(aLauncher.source, function LastDirCallback(lastDir) {
+      gDownloadLastDir.getFileAsync(aLauncher.source, lastDir => {
         if (lastDir && isUsableDirectory(lastDir))
           picker.displayDirectory = lastDir;
 
         picker.open(returnValue => {
           if (returnValue == nsIFilePicker.returnCancel) {
             // null result means user cancelled.
             aLauncher.saveDestinationAvailable(null);
             return;
@@ -357,17 +357,17 @@ nsUnknownContentTypeDialog.prototype = {
                 aLauncher.saveDestinationAvailable(null);
                 return;
               }
 
             }
           }
           aLauncher.saveDestinationAvailable(result);
         });
-      }.bind(this));
+      });
     }.bind(this)).then(null, Components.utils.reportError);
   },
 
   getFinalLeafName: function (aLeafName, aFileExt)
   {
     // Remove any leading periods, since we don't want to save hidden files
     // automatically.
     aLeafName = aLeafName.replace(/^\.+/, "");
--- a/toolkit/mozapps/extensions/LightweightThemeManager.jsm
+++ b/toolkit/mozapps/extensions/LightweightThemeManager.jsm
@@ -304,19 +304,19 @@ this.LightweightThemeManager = {
     }
 
     if (aData) {
       let usedThemes = _usedThemesExceptId(aData.id);
       usedThemes.unshift(aData);
       _updateUsedThemes(usedThemes);
       if (PERSIST_ENABLED) {
         LightweightThemeImageOptimizer.purge();
-        _persistImages(aData, function() {
+        _persistImages(aData, () => {
           _notifyWindows(this.currentThemeForDisplay);
-        }.bind(this));
+        });
       }
     }
 
     if (aData)
       _prefs.setCharPref("selectedThemeID", aData.id);
     else
       _prefs.setCharPref("selectedThemeID", "");
 
--- a/toolkit/mozapps/extensions/content/extensions.js
+++ b/toolkit/mozapps/extensions/content/extensions.js
@@ -3255,20 +3255,20 @@ var gDetailView = {
         let timeString = gStrings.ext.GetStringFromName(timeKey);
         timeMessage = PluralForm.get(days, timeString)
                                 .replace("#1", days);
       }
 
       document.getElementById("detail-experiment-time").value = timeMessage;
     }
 
-    this.fillSettingsRows(aScrollToPreferences, (function() {
+    this.fillSettingsRows(aScrollToPreferences, () => {
       this.updateState();
       gViewController.notifyViewChanged();
-    }).bind(this));
+    });
   },
 
   show(aAddonId, aRequest) {
     let index = aAddonId.indexOf("/preferences");
     let scrollToPreferences = false;
     if (index >= 0) {
       aAddonId = aAddonId.substring(0, index);
       scrollToPreferences = true;
--- a/toolkit/mozapps/update/tests/unit_aus_update/downloadInterruptedRecovery.js
+++ b/toolkit/mozapps/update/tests/unit_aus_update/downloadInterruptedRecovery.js
@@ -98,17 +98,17 @@ IncrementalDownload.prototype = {
     this._finalURI = uri;
   },
 
   start(observer, ctxt) {
     let tm = Cc["@mozilla.org/thread-manager;1"].
              getService(Ci.nsIThreadManager);
     // Do the actual operation async to give a chance for observers
     // to add themselves.
-    tm.dispatchToMainThread(function() {
+    tm.dispatchToMainThread(() => {
       this._observer = observer.QueryInterface(Ci.nsIRequestObserver);
       this._ctxt = ctxt;
       this._observer.onStartRequest(this, this._ctxt);
       let mar = getTestDirFile(FILE_SIMPLE_MAR);
       mar.copyTo(this._destination.parent, this._destination.leafName);
       let status = Cr.NS_OK;
       switch (gIncrementalDownloadErrorType++) {
         case 0:
@@ -132,17 +132,17 @@ IncrementalDownload.prototype = {
           tm2.dispatchToMainThread(function() {
             Services.obs.notifyObservers(gAUS,
                                          "network:offline-status-changed",
                                          "online");
           });
           break;
       }
       this._observer.onStopRequest(this, this._ctxt, status);
-    }.bind(this));
+    });
   },
 
   get URI() {
     return this._URI;
   },
 
   get currentSize() {
     throw Cr.NS_ERROR_NOT_IMPLEMENTED;