Merge m-c to b2g-i
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Thu, 01 Oct 2015 14:17:57 +0200
changeset 265525 cb44ba24be1220be4d69ffc373b3dfc51f080309
parent 265524 507788f6072d18fca91a559a3cb7c1afb6e83f53 (current diff)
parent 265494 2c1fb007137dcb68b1862a79553b53f1a34c99c3 (diff)
child 265526 90c9af6a9708445d2e96746c34ab419376e9bf69
push id15472
push usercbook@mozilla.com
push dateFri, 02 Oct 2015 11:51:34 +0000
treeherderfx-team@2c33ef6b27e0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone44.0a1
Merge m-c to b2g-i
browser/components/loop/content/shared/img/svg/glyph-account-16x16.svg
browser/components/loop/content/shared/img/svg/glyph-signin-16x16.svg
browser/components/loop/content/shared/img/svg/glyph-signout-16x16.svg
devtools/shared/heapsnapshot/tests/gtest/UniqueStringHashPolicy.cpp
js/src/jsapi-tests/testOps.cpp
layout/tools/reftest/print-manifest-dirs.py
testing/mozbase/Makefile.in
testing/web-platform/Makefile.in
testing/web-platform/mozilla/meta/service-workers/service-worker/fetch-request-no-freshness-headers.https.html.ini
testing/web-platform/mozilla/meta/service-workers/service-worker/onactivate-script-error.https.html.ini
new file mode 100644
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,5 @@
+{
+  "plugins": [
+    "mozilla"
+  ]
+}
--- a/.gitignore
+++ b/.gitignore
@@ -66,8 +66,11 @@ GRTAGS
 GSYMS
 GPATH
 
 # Git clone directory for updating web-platform-tests
 testing/web-platform/sync/
 
 # Android Gradle artifacts.
 mobile/android/gradle/.gradle
+
+# Ignore node_modules from eslint-plugin-mozilla
+testing/eslint-plugin-mozilla/node_modules/
--- a/.hgignore
+++ b/.hgignore
@@ -88,8 +88,11 @@ GPATH
 
 # XCode project cruft
 ^embedding/ios/GeckoEmbed/GeckoEmbed.xcodeproj/project.xcworkspace/xcuserdata
 ^embedding/ios/GeckoEmbed/GeckoEmbed.xcodeproj/xcuserdata
 
 # Ignore mozharness execution files
 ^testing/mozharness/logs/
 ^testing/mozharness/build/
+
+# Ignore node_modules from eslint-plugin-mozilla
+^testing/eslint-plugin-mozilla/node_modules/
--- a/accessible/generic/RootAccessible.cpp
+++ b/accessible/generic/RootAccessible.cpp
@@ -34,16 +34,17 @@
 #include "nsIDocument.h"
 #include "nsIInterfaceRequestorUtils.h"
 #include "nsIPropertyBag2.h"
 #include "nsIServiceManager.h"
 #include "nsPIDOMWindow.h"
 #include "nsIWebBrowserChrome.h"
 #include "nsReadableUtils.h"
 #include "nsFocusManager.h"
+#include "nsGlobalWindow.h"
 
 #ifdef MOZ_XUL
 #include "nsIXULDocument.h"
 #include "nsIXULWindow.h"
 #endif
 
 using namespace mozilla;
 using namespace mozilla::a11y;
@@ -477,20 +478,19 @@ RootAccessible::Shutdown()
 }
 
 Relation
 RootAccessible::RelationByType(RelationType aType)
 {
   if (!mDocumentNode || aType != RelationType::EMBEDS)
     return DocAccessibleWrap::RelationByType(aType);
 
-  nsIDOMWindow* rootWindow = mDocumentNode->GetWindow();
+  nsPIDOMWindow* rootWindow = mDocumentNode->GetWindow();
   if (rootWindow) {
-    nsCOMPtr<nsIDOMWindow> contentWindow;
-    rootWindow->GetContent(getter_AddRefs(contentWindow));
+    nsCOMPtr<nsIDOMWindow> contentWindow = nsGlobalWindow::Cast(rootWindow)->GetContent();
     if (contentWindow) {
       nsCOMPtr<nsIDOMDocument> contentDOMDocument;
       contentWindow->GetDocument(getter_AddRefs(contentDOMDocument));
       nsCOMPtr<nsIDocument> contentDocumentNode =
         do_QueryInterface(contentDOMDocument);
       if (contentDocumentNode) {
         DocAccessible* contentDocument =
           GetAccService()->GetDocAccessible(contentDocumentNode);
--- a/b2g/components/MailtoProtocolHandler.js
+++ b/b2g/components/MailtoProtocolHandler.js
@@ -15,17 +15,17 @@ function MailtoProtocolHandler() {
 MailtoProtocolHandler.prototype = {
 
   scheme: "mailto",
   defaultPort: -1,
   protocolFlags: Ci.nsIProtocolHandler.URI_NORELATIVE |
                  Ci.nsIProtocolHandler.URI_NOAUTH |
                  Ci.nsIProtocolHandler.URI_LOADABLE_BY_ANYONE |
                  Ci.nsIProtocolHandler.URI_DOES_NOT_RETURN_DATA,
-  allowPort: function() false,
+  allowPort: () => false,
 
   newURI: function Proto_newURI(aSpec, aOriginCharset) {
     let uri = Cc["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI);
     uri.spec = aSpec;
     return uri;
   },
 
   newChannel2: function Proto_newChannel2(aURI, aLoadInfo) {
--- a/b2g/components/SimulatorScreen.js
+++ b/b2g/components/SimulatorScreen.js
@@ -57,23 +57,23 @@ function hookScreen(window) {
 
   screen.mozUnlockOrientation = function() {
     debug('mozOrientationUnlock from', origin);
     GlobalSimulatorScreen.unlock();
     return true;
   };
 
   Object.defineProperty(screen, 'width', {
-    get: function () GlobalSimulatorScreen.width
+    get: () => GlobalSimulatorScreen.width
   });
   Object.defineProperty(screen, 'height', {
-    get: function () GlobalSimulatorScreen.height
+    get: () => GlobalSimulatorScreen.height
   });
   Object.defineProperty(screen, 'mozOrientation', {
-    get: function () GlobalSimulatorScreen.mozOrientation
+    get: () => GlobalSimulatorScreen.mozOrientation
   });
 }
 
 function SimulatorScreen() {}
 SimulatorScreen.prototype = {
   classID:         Components.ID('{c83c02c0-5d43-4e3e-987f-9173b313e880}'),
   QueryInterface:  XPCOMUtils.generateQI([Ci.nsIObserver,
                                           Ci.nsISupportsWeakReference]),
--- a/b2g/components/SmsProtocolHandler.js
+++ b/b2g/components/SmsProtocolHandler.js
@@ -24,17 +24,17 @@ function SmsProtocolHandler() {
 SmsProtocolHandler.prototype = {
 
   scheme: "sms",
   defaultPort: -1,
   protocolFlags: Ci.nsIProtocolHandler.URI_NORELATIVE |
                  Ci.nsIProtocolHandler.URI_NOAUTH |
                  Ci.nsIProtocolHandler.URI_LOADABLE_BY_ANYONE |
                  Ci.nsIProtocolHandler.URI_DOES_NOT_RETURN_DATA,
-  allowPort: function() false,
+  allowPort: () => false,
 
   newURI: function Proto_newURI(aSpec, aOriginCharset) {
     let uri = Cc["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI);
     uri.spec = aSpec;
     return uri;
   },
 
   newChannel2: function Proto_newChannel2(aURI, aLoadInfo) {
--- a/b2g/components/TelProtocolHandler.js
+++ b/b2g/components/TelProtocolHandler.js
@@ -23,17 +23,17 @@ function TelProtocolHandler() {
 TelProtocolHandler.prototype = {
 
   scheme: "tel",
   defaultPort: -1,
   protocolFlags: Ci.nsIProtocolHandler.URI_NORELATIVE |
                  Ci.nsIProtocolHandler.URI_NOAUTH |
                  Ci.nsIProtocolHandler.URI_LOADABLE_BY_ANYONE |
                  Ci.nsIProtocolHandler.URI_DOES_NOT_RETURN_DATA,
-  allowPort: function() false,
+  allowPort: () => false,
 
   newURI: function Proto_newURI(aSpec, aOriginCharset) {
     let uri = Cc["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI);
     uri.spec = aSpec;
     return uri;
   },
 
   newChannel2: function Proto_newChannel(aURI, aLoadInfo) {
--- a/b2g/installer/package-manifest.in
+++ b/b2g/installer/package-manifest.in
@@ -180,16 +180,17 @@
 @RESPATH@/components/cookie.xpt
 @RESPATH@/components/devtools_security.xpt
 @RESPATH@/components/directory.xpt
 @RESPATH@/components/diskspacewatcher.xpt
 @RESPATH@/components/docshell.xpt
 @RESPATH@/components/dom.xpt
 @RESPATH@/components/dom_activities.xpt
 @RESPATH@/components/dom_apps.xpt
+@RESPATH@/components/dom_newapps.xpt
 @RESPATH@/components/dom_audiochannel.xpt
 @RESPATH@/components/dom_base.xpt
 @RESPATH@/components/dom_system.xpt
 #ifdef MOZ_WIDGET_GONK
 @RESPATH@/components/dom_wifi.xpt
 @RESPATH@/components/dom_system_gonk.xpt
 #endif
 #ifdef MOZ_B2G_RIL
@@ -724,16 +725,20 @@
 @RESPATH@/components/PrivateBrowsing.manifest
 @RESPATH@/components/PrivateBrowsingTrackingProtectionWhitelist.js
 
 ; GNOME hooks
 #ifdef MOZ_ENABLE_GNOME_COMPONENT
 @RESPATH@/components/@DLL_PREFIX@mozgnome@DLL_SUFFIX@
 #endif
 
+; Signed Packaged Content
+@RESPATH@/components/InstallPackagedWebapp.manifest
+@RESPATH@/components/InstallPackagedWebapp.js
+
 ; ANGLE on Win32
 #ifdef XP_WIN32
 #ifndef HAVE_64BIT_BUILD
 @BINPATH@/libEGL.dll
 @BINPATH@/libGLESv2.dll
 #endif
 #endif
 
--- a/b2g/locales/Makefile.in
+++ b/b2g/locales/Makefile.in
@@ -52,17 +52,17 @@ include $(topsrcdir)/toolkit/locales/l10
 
 $(STAGEDIST): $(DIST)/branding
 
 $(DIST)/branding:
 	$(NSINSTALL) -D $@
 
 libs::
 	@if test -f '$(LOCALE_SRCDIR)/existing-profile-defaults.js'; then \
-	  $(PYTHON) -m mozbuild.action.preprocessor $(PREF_PPFLAGS) $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) \
+	  $(PYTHON) -m mozbuild.action.preprocessor $(PREF_PPFLAGS) $(DEFINES) $(ACDEFINES) $(MOZ_DEBUG_DEFINES) \
 	    $(LOCALE_SRCDIR)/existing-profile-defaults.js -o $(FINAL_TARGET)/defaults/existing-profile-defaults.js; \
 	fi
 
 NO_JA_JP_MAC_AB_CD := $(if $(filter ja-JP-mac, $(AB_CD)),ja,$(AB_CD))
 
 libs-%:
 	$(NSINSTALL) -D $(DIST)/install
 	@$(MAKE) -C ../../toolkit/locales libs-$*
--- a/b2g/simulator/lib/simulator-process.js
+++ b/b2g/simulator/lib/simulator-process.js
@@ -16,34 +16,36 @@ const { Promise: promise } = Cu.import("
 const { EventEmitter } = Cu.import("resource://gre/modules/devtools/shared/event-emitter.js", {});
 
 
 // Log subprocess error and debug messages to the console.  This logs messages
 // for all consumers of the API.  We trim the messages because they sometimes
 // have trailing newlines.  And note that registerLogHandler actually registers
 // an error handler, despite its name.
 Subprocess.registerLogHandler(
-  function(s) console.error("subprocess: " + s.trim())
+  s => console.error("subprocess: " + s.trim())
 );
 Subprocess.registerDebugHandler(
-  function(s) console.debug("subprocess: " + s.trim())
+  s => console.debug("subprocess: " + s.trim())
 );
 
 function SimulatorProcess(options) {
   this.options = options;
 
   EventEmitter.decorate(this);
   this.on("stdout", (e, data) => { console.log(data.trim()) });
   this.on("stderr", (e, data) => { console.error(data.trim()) });
 }
 
 SimulatorProcess.prototype = {
 
   // check if b2g is running
-  get isRunning() !!this.process,
+  get isRunning() {
+    return !!this.process;
+  },
 
   /**
    * Start the process and connect the debugger client.
    */
   run: function() {
     // kill before start if already running
     if (this.process != null) {
       this.process
--- a/browser/base/content/browser-gestureSupport.js
+++ b/browser/base/content/browser-gestureSupport.js
@@ -49,17 +49,17 @@ var gGestureSupport = {
    */
   handleEvent: function GS_handleEvent(aEvent) {
     if (!Services.prefs.getBoolPref(
            "dom.debug.propagate_gesture_events_through_content")) {
       aEvent.stopPropagation();
     }
 
     // Create a preference object with some defaults
-    let def = function(aThreshold, aLatched)
+    let def = (aThreshold, aLatched) =>
       ({ threshold: aThreshold, latched: !!aLatched });
 
     switch (aEvent.type) {
       case "MozSwipeGestureMayStart":
         if (this._shouldDoSwipeGesture(aEvent)) {
           aEvent.preventDefault();
         }
         break;
--- a/browser/base/content/browser-loop.js
+++ b/browser/base/content/browser-loop.js
@@ -528,22 +528,20 @@ var LoopUI;
       let pageURI = gBrowser.selectedTab.linkedBrowser.currentURI.spec;
       // If the tab page’s url starts with http(s), fetch icon.
       if (!/^https?:/.test(pageURI)) {
         callback();
         return;
       }
 
       this.PlacesUtils.promiseFaviconLinkUrl(pageURI).then(uri => {
-        uri = this.PlacesUtils.getImageURLForResolution(window, uri.spec);
-
         // We XHR the favicon to get a File object, which we can pass to the FileReader
         // object. The FileReader turns the File object into a data-uri.
         let xhr = new XMLHttpRequest();
-        xhr.open("get", uri, true);
+        xhr.open("get", uri.spec, true);
         xhr.responseType = "blob";
         xhr.overrideMimeType("image/x-icon");
         xhr.onload = () => {
           if (xhr.status != 200) {
             callback(new Error("Invalid status code received for favicon XHR: " + xhr.status));
             return;
           }
 
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -25,17 +25,17 @@ var StarUI = {
     element.addEventListener("keypress", this, false);
     return this.panel = element;
   },
 
   // Array of command elements to disable when the panel is opened.
   get _blockedCommands() {
     delete this._blockedCommands;
     return this._blockedCommands =
-      ["cmd_close", "cmd_closeWindow"].map(function (id) this._element(id), this);
+      ["cmd_close", "cmd_closeWindow"].map(id => this._element(id));
   },
 
   _blockCommands: function SU__blockCommands() {
     this._blockedCommands.forEach(function (elt) {
       // make sure not to permanently disable this item (see bug 409155)
       if (elt.hasAttribute("wasDisabled"))
         return;
       if (elt.getAttribute("disabled") == "true") {
@@ -1493,17 +1493,17 @@ var BookmarkingUI = {
         Components.utils.reportError("BookmarkingUI did not receive current URI");
         return;
       }
 
       // It's possible that onItemAdded gets called before the async statement
       // calls back.  For such an edge case, retain all unique entries from both
       // arrays.
       this._itemIds = this._itemIds.filter(
-        function (id) aItemIds.indexOf(id) == -1
+        id => aItemIds.indexOf(id) == -1
       ).concat(aItemIds);
 
       this._updateStar();
 
       // Start observing bookmarks if needed.
       if (!this._hasBookmarksObserver) {
         try {
           PlacesUtils.addLazyBookmarkObserver(this);
--- a/browser/base/content/browser-syncui.js
+++ b/browser/base/content/browser-syncui.js
@@ -248,17 +248,17 @@ var gSyncUI = {
   },
 
   // Commands
   // doSync forces a sync - it *does not* return a promise as it is called
   // via the various UI components.
   doSync() {
     this._needsSetup().then(needsSetup => {
       if (!needsSetup) {
-        setTimeout(function () Weave.Service.errorHandler.syncAndReportErrors(), 0);
+        setTimeout(() => Weave.Service.errorHandler.syncAndReportErrors(), 0);
       }
       Services.obs.notifyObservers(null, "cloudsync:user-sync", null);
     }).catch(err => {
       this.log.error("Failed to force a sync", err);
     });
   },
 
   // Handle clicking the toolbar button - which either opens the Sync setup
--- a/browser/base/content/browser-tabview.js
+++ b/browser/base/content/browser-tabview.js
@@ -220,17 +220,17 @@ var TabView = {
         self._tabCloseEventListener = null;
       }
       if (self._SSWindowStateReadyListener) {
         window.removeEventListener(
           "SSWindowStateReady", self._SSWindowStateReadyListener, false);
         self._SSWindowStateReadyListener = null;
       }
 
-      self._initFrameCallbacks.forEach(function (cb) cb());
+      self._initFrameCallbacks.forEach(cb => cb());
       self._initFrameCallbacks = [];
     }, false);
 
     this._iframe.setAttribute("src", "chrome://browser/content/tabview.html");
     this._deck.appendChild(this._iframe);
 
     // ___ create tooltip
     let tooltip = document.createElement("tooltip");
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -3265,17 +3265,17 @@ function getMarkupDocumentViewer()
 
 // This function is obsolete. Newer code should use <tooltip page="true"/> instead.
 function FillInHTMLTooltip(tipElement)
 {
   document.getElementById("aHTMLTooltip").fillInPageTooltip(tipElement);
 }
 
 var browserDragAndDrop = {
-  canDropLink: function (aEvent) Services.droppedLinkHandler.canDropLink(aEvent, true),
+  canDropLink: aEvent => Services.droppedLinkHandler.canDropLink(aEvent, true),
 
   dragOver: function (aEvent)
   {
     if (this.canDropLink(aEvent)) {
       aEvent.preventDefault();
     }
   },
 
@@ -3413,17 +3413,17 @@ const DOMLinkHandler = {
 
 const BrowserSearch = {
   addEngine: function(browser, engine, uri) {
     if (!this.searchBar)
       return;
 
     // Check to see whether we've already added an engine with this title
     if (browser.engines) {
-      if (browser.engines.some(function (e) e.title == engine.title))
+      if (browser.engines.some(e => e.title == engine.title))
         return;
     }
 
     var hidden = false;
     // If this engine (identified by title) is already in the list, add it
     // to the list of hidden engines rather than to the main list.
     // XXX This will need to be changed when engines are identified by URL;
     // see bug 335102.
@@ -3780,17 +3780,16 @@ function FillHistoryMenu(aParent) {
 
       // Cache this so that gotoHistoryIndex doesn't need the original index
       item.setAttribute("historyindex", j - index);
 
       if (j != index) {
         PlacesUtils.favicons.getFaviconURLForPage(entryURI, function (aURI) {
           if (aURI) {
             let iconURL = PlacesUtils.favicons.getFaviconLinkForIcon(aURI).spec;
-            iconURL = PlacesUtils.getImageURLForResolution(window, iconURL);
             item.style.listStyleImage = "url(" + iconURL + ")";
           }
         });
       }
 
       if (j < index) {
         item.className = "unified-nav-back menuitem-iconic menuitem-with-favicon";
         item.setAttribute("tooltiptext", tooltipBack);
@@ -4516,17 +4515,19 @@ var LinkTargetDisplay = {
   get DELAY_SHOW() {
      delete this.DELAY_SHOW;
      return this.DELAY_SHOW = Services.prefs.getIntPref("browser.overlink-delay");
   },
 
   DELAY_HIDE: 250,
   _timer: 0,
 
-  get _isVisible () XULBrowserWindow.statusTextField.label != "",
+  get _isVisible () {
+    return XULBrowserWindow.statusTextField.label != "";
+  },
 
   update: function () {
     clearTimeout(this._timer);
     window.removeEventListener("mousemove", this, true);
 
     if (!XULBrowserWindow.overLink) {
       if (XULBrowserWindow.hideOverLinkImmediately)
         this._hide();
@@ -4913,17 +4914,17 @@ nsBrowserAccess.prototype = {
                                         aParams.isPrivate, isExternal);
     if (browser)
       return browser.QueryInterface(Ci.nsIFrameLoaderOwner);
 
     return null;
   },
 
   isTabContentWindow: function (aWindow) {
-    return gBrowser.browsers.some(function (browser) browser.contentWindow == aWindow);
+    return gBrowser.browsers.some(browser => browser.contentWindow == aWindow);
   },
 }
 
 function getTogglableToolbars() {
   let toolbarNodes = Array.slice(gNavToolbox.childNodes);
   toolbarNodes = toolbarNodes.concat(gNavToolbox.externalToolbars);
   toolbarNodes = toolbarNodes.filter(node => node.getAttribute("toolbarname"));
   return toolbarNodes;
@@ -5144,19 +5145,19 @@ var TabsInTitlebar = {
   _lastSizeMode: null,
 
   _readPref: function () {
     this.allowedBy("pref",
                    Services.prefs.getBoolPref(this._prefName));
   },
 
   _update: function (aForce=false) {
-    function $(id) document.getElementById(id);
-    function rect(ele) ele.getBoundingClientRect();
-    function verticalMargins(cstyle) parseFloat(cstyle.marginBottom) + parseFloat(cstyle.marginTop);
+    let $ = id => document.getElementById(id);
+    let rect = ele => ele.getBoundingClientRect();
+    let verticalMargins = cstyle => parseFloat(cstyle.marginBottom) + parseFloat(cstyle.marginTop);
 
     if (!this._initialized || window.fullScreen)
       return;
 
     let allowed = true;
 
     if (!aForce) {
       // _update is called on resize events, because the window is not ready
@@ -7322,22 +7323,29 @@ var gIdentityHandler = {
     menulist.setAttribute("oncommand", "gIdentityHandler.setPermission('" +
                                        aPermission + "', this.value)");
     menulist.setAttribute("id", "identity-popup-permission:" + aPermission);
 
     let label = document.createElement("label");
     label.setAttribute("flex", "1");
     label.setAttribute("class", "identity-popup-permission-label");
     label.setAttribute("control", menulist.getAttribute("id"));
-    label.setAttribute("value", SitePermissions.getPermissionLabel(aPermission));
+    label.textContent = SitePermissions.getPermissionLabel(aPermission);
 
     let container = document.createElement("hbox");
     container.setAttribute("align", "center");
     container.appendChild(label);
     container.appendChild(menulist);
+
+    // The menuitem text can be long and we don't want the dropdown
+    // to expand to the width of unselected labels.
+    // Need to set this attribute after it's appended, otherwise it gets
+    // overridden with sizetopopup="pref".
+    menulist.setAttribute("sizetopopup", "none");
+
     return container;
   }
 };
 
 function getNotificationBox(aWindow) {
   var foundBrowser = gBrowser.getBrowserForDocument(aWindow.document);
   if (foundBrowser)
     return gBrowser.getNotificationBox(foundBrowser)
@@ -7347,18 +7355,22 @@ function getNotificationBox(aWindow) {
 function getTabModalPromptBox(aWindow) {
   var foundBrowser = gBrowser.getBrowserForDocument(aWindow.document);
   if (foundBrowser)
     return gBrowser.getTabModalPromptBox(foundBrowser);
   return null;
 };
 
 /* DEPRECATED */
-function getBrowser() gBrowser;
-function getNavToolbox() gNavToolbox;
+function getBrowser() {
+  return gBrowser;
+}
+function getNavToolbox() {
+  return gNavToolbox;
+}
 
 var gPrivateBrowsingUI = {
   init: function PBUI_init() {
     // Do nothing for normal windows
     if (!PrivateBrowsingUtils.isWindowPrivate(window)) {
       return;
     }
 
--- a/browser/base/content/chatWindow.xul
+++ b/browser/base/content/chatWindow.xul
@@ -123,17 +123,19 @@ chatBrowserAccess.prototype = {
     return browser ? browser.contentWindow : null;
   },
 
   openURIInFrame: function browser_openURIInFrame(aURI, aParams, aWhere, aContext) {
     let browser = this._openURIInNewTab(aURI, aWhere);
     return browser ? browser.QueryInterface(Ci.nsIFrameLoaderOwner) : null;
   },
 
-  isTabContentWindow: function (aWindow) this.contentWindow == aWindow,
+  isTabContentWindow: function (aWindow) {
+    return this.contentWindow == aWindow;
+  },
 };
 
 </script>
 
 #include browser-sets.inc
 
 #ifdef XP_MACOSX
 #include browser-menubar.inc
--- a/browser/base/content/contentSearchUI.js
+++ b/browser/base/content/contentSearchUI.js
@@ -668,22 +668,20 @@ ContentSearchUIController.prototype = {
         entry.appendChild(document.createTextNode(" "));
       }
     }
 
     row.appendChild(entry);
     return row;
   },
 
-  // Converts favicon array buffer into data URI of the right size and dpi.
+  // Converts favicon array buffer into a data URI.
   _getFaviconURIFromBuffer: function (buffer) {
     let blob = new Blob([buffer]);
-    let dpiSize = Math.round(16 * window.devicePixelRatio);
-    let sizeStr = dpiSize + "," + dpiSize;
-    return URL.createObjectURL(blob) + "#-moz-resolution=" + sizeStr;
+    return URL.createObjectURL(blob);
   },
 
   // Adds "@2x" to the name of the given PNG url for "retina" screens.
   _getImageURIForCurrentResolution: function (uri) {
     if (window.devicePixelRatio > 1) {
       return uri.replace(/\.png$/, "@2x.png");
     }
     return uri;
--- a/browser/base/content/sanitize.js
+++ b/browser/base/content/sanitize.js
@@ -430,18 +430,18 @@ Sanitizer.prototype = {
           if (findBarCanClear) {
             aCallback("formdata", true, aArg);
             return false;
           }
         }
 
         let count = 0;
         let countDone = {
-          handleResult : function(aResult) count = aResult,
-          handleError : function(aError) Components.utils.reportError(aError),
+          handleResult : aResult => count = aResult,
+          handleError : aError => Components.utils.reportError(aError),
           handleCompletion :
             function(aReason) { aCallback("formdata", aReason == 0 && count > 0, aArg); }
         };
         FormHistory.count({}, countDone);
         return false;
       }
     },
 
--- a/browser/base/content/sync/setup.js
+++ b/browser/base/content/sync/setup.js
@@ -46,17 +46,19 @@ var gSyncSetup = {
   _disabledSites: [],
 
   status: {
     password: false,
     email: false,
     server: false
   },
 
-  get _remoteSites() [Weave.Service.serverURL, RECAPTCHA_DOMAIN],
+  get _remoteSites() {
+    return [Weave.Service.serverURL, RECAPTCHA_DOMAIN];
+  },
 
   get _usingMainServers() {
     if (this._settingUpNew)
       return document.getElementById("server").selectedIndex == 0;
     return document.getElementById("existingServer").selectedIndex == 0;
   },
 
   init: function () {
@@ -74,17 +76,17 @@ var gSyncSetup = {
         //        of `this`. Fix in a followup. (bug 583347)
         if (add)
           Weave.Svc.Obs.add(topic, self[func], self);
         else
           Weave.Svc.Obs.remove(topic, self[func], self);
       });
     };
     addRem(true);
-    window.addEventListener("unload", function() addRem(false), false);
+    window.addEventListener("unload", () => addRem(false), false);
 
     window.setTimeout(function () {
       // Force Service to be loaded so that engines are registered.
       // See Bug 670082.
       Weave.Service;
     }, 0);
 
     this.captchaBrowser = document.getElementById("captcha");
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -45,17 +45,17 @@
       <field name="tabs" readonly="true">
         this.tabContainer.childNodes;
       </field>
 
       <property name="visibleTabs" readonly="true">
         <getter><![CDATA[
           if (!this._visibleTabs)
             this._visibleTabs = Array.filter(this.tabs,
-                                             function (tab) !tab.hidden && !tab.closing);
+                                             tab => !tab.hidden && !tab.closing);
           return this._visibleTabs;
         ]]></getter>
       </property>
 
       <field name="closingTabsEnum" readonly="true">({ ALL: 0, OTHER: 1, TO_END: 2 });</field>
 
       <field name="_visibleTabs">null</field>
 
@@ -899,19 +899,16 @@
               this.mFaviconService.setAndFetchFaviconForPage(browser.currentURI,
                                                              aURI, false,
                                                              PrivateBrowsingUtils.isWindowPrivate(window) ?
                                                                this.mFaviconService.FAVICON_LOAD_PRIVATE :
                                                                this.mFaviconService.FAVICON_LOAD_NON_PRIVATE);
             }
 
             let sizedIconUrl = browser.mIconURL || "";
-            if (sizedIconUrl) {
-              sizedIconUrl = this.PlacesUtils.getImageURLForResolution(window, sizedIconUrl);
-            }
             if (sizedIconUrl != aTab.getAttribute("image")) {
               if (sizedIconUrl)
                 aTab.setAttribute("image", sizedIconUrl);
               else
                 aTab.removeAttribute("image");
               this._tabAttrModified(aTab, ["image"]);
             }
 
@@ -2697,34 +2694,34 @@
         </body>
       </method>
 
       <method name="removeProgressListener">
         <parameter name="aListener"/>
         <body>
           <![CDATA[
             this.mProgressListeners =
-              this.mProgressListeners.filter(function (l) l != aListener);
+              this.mProgressListeners.filter(l => l != aListener);
          ]]>
         </body>
       </method>
 
       <method name="addTabsProgressListener">
         <parameter name="aListener"/>
         <body>
           this.mTabsProgressListeners.push(aListener);
         </body>
       </method>
 
       <method name="removeTabsProgressListener">
         <parameter name="aListener"/>
         <body>
         <![CDATA[
           this.mTabsProgressListeners =
-            this.mTabsProgressListeners.filter(function (l) l != aListener);
+            this.mTabsProgressListeners.filter(l => l != aListener);
         ]]>
         </body>
       </method>
 
       <method name="getBrowserForTab">
         <parameter name="aTab"/>
         <body>
         <![CDATA[
@@ -2828,17 +2825,17 @@
       <property name="selectedBrowser"
                 onget="return this.mCurrentBrowser;"
                 readonly="true"/>
 
       <property name="browsers" readonly="true">
        <getter>
           <![CDATA[
             return this._browsers ||
-                   (this._browsers = Array.map(this.tabs, function (tab) tab.linkedBrowser));
+                   (this._browsers = Array.map(this.tabs, tab => tab.linkedBrowser));
           ]]>
         </getter>
       </property>
       <field name="_browsers">null</field>
 
       <!-- Moves a tab to a new browser window, unless it's already the only tab
            in the current window, in which case this will do nothing. -->
       <method name="replaceTabWithWindow">
@@ -5517,17 +5514,19 @@
           toDrag = canvas;
         }
         dt.setDragImage(toDrag, -16 * scale, -16 * scale);
 
         // _dragData.offsetX/Y give the coordinates that the mouse should be
         // positioned relative to the corner of the new window created upon
         // dragend such that the mouse appears to have the same position
         // relative to the corner of the dragged tab.
-        function clientX(ele) ele.getBoundingClientRect().left;
+        function clientX(ele) {
+          return ele.getBoundingClientRect().left;
+        }
         let tabOffsetX = clientX(tab) - clientX(this);
         tab._dragData = {
           offsetX: event.screenX - window.screenX - tabOffsetX,
           offsetY: event.screenY - window.screenY,
           scrollX: this.mTabstrip.scrollPosition,
           screenX: event.screenX
         };
 
--- a/browser/base/content/test/general/browser_action_searchengine_alias.js
+++ b/browser/base/content/test/general/browser_action_searchengine_alias.js
@@ -32,17 +32,16 @@ add_task(function* () {
 
     return PlacesTestUtils.clearHistory();
   });
 
   yield promiseAutocompleteResultPopup("moz open a search");
 
   let result = gURLBar.popup.richlistbox.children[0];
   ok(result.hasAttribute("image"), "Result should have an image attribute");
-  // Image attribute gets a suffix (-moz-resolution) added in the value.
-  ok(result.getAttribute("image").startsWith(engine.iconURI.spec),
+  ok(result.getAttribute("image") === engine.iconURI.spec,
      "Image attribute should have the search engine's icon");
 
   EventUtils.synthesizeKey("VK_RETURN" , { });
   yield promiseTabLoaded(gBrowser.selectedTab);
 
   is(gBrowser.selectedBrowser.currentURI.spec, "http://example.com/?q=open+a+search");
 });
--- a/browser/base/content/test/general/browser_bug521216.js
+++ b/browser/base/content/test/general/browser_bug521216.js
@@ -1,12 +1,12 @@
 var expected = ["TabOpen", "onStateChange", "onLocationChange", "onLinkIconAvailable"];
 var actual = [];
 var tabIndex = -1;
-this.__defineGetter__("tab", function () gBrowser.tabs[tabIndex]);
+this.__defineGetter__("tab", () => gBrowser.tabs[tabIndex]);
 
 function test() {
   waitForExplicitFinish();
   tabIndex = gBrowser.tabs.length;
   gBrowser.addTabsProgressListener(progressListener);
   gBrowser.tabContainer.addEventListener("TabOpen", TabOpen, false);
   gBrowser.addTab("data:text/html,<html><head><link href='about:logo' rel='shortcut icon'>");
 }
--- a/browser/base/content/test/general/browser_bug537013.js
+++ b/browser/base/content/test/general/browser_bug537013.js
@@ -33,17 +33,17 @@ var newWindow;
 
 function test() {
   waitForExplicitFinish();
   registerCleanupFunction(function () {
     while (tabs.length) {
       gBrowser.removeTab(tabs.pop());
     }
   });
-  texts.forEach(function(aText) addTabWithText(aText));
+  texts.forEach(aText => addTabWithText(aText));
 
   // Set up the first tab
   gBrowser.selectedTab = tabs[0];
 
   setFindString(texts[0]);
   // Turn on highlight for testing bug 891638
   gFindBar.getElement("highlight").checked = true;
 
--- a/browser/base/content/test/general/browser_bug580638.js
+++ b/browser/base/content/test/general/browser_bug580638.js
@@ -1,17 +1,19 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 function test() {
   waitForExplicitFinish();
 
   function testState(aPinned) {
-    function elemAttr(id, attr) document.getElementById(id).getAttribute(attr);
+    function elemAttr(id, attr) {
+      return document.getElementById(id).getAttribute(attr);
+    }
 
     if (aPinned) {
       is(elemAttr("key_close", "disabled"), "true",
          "key_close should be disabled when a pinned-tab is selected");
       is(elemAttr("menu_close", "key"), "",
          "menu_close shouldn't have a key set when a pinned is selected");
     }
     else {
--- a/browser/base/content/test/general/browser_bug580956.js
+++ b/browser/base/content/test/general/browser_bug580956.js
@@ -1,10 +1,11 @@
-function numClosedTabs()
-  SessionStore.getClosedTabCount(window);
+function numClosedTabs() {
+  return SessionStore.getClosedTabCount(window);
+}
 
 function isUndoCloseEnabled() {
   updateTabContextMenu();
   return !document.getElementById("context_undoCloseTab").disabled;
 }
 
 function test() {
   waitForExplicitFinish();
--- a/browser/base/content/test/general/browser_bug624734.js
+++ b/browser/base/content/test/general/browser_bug624734.js
@@ -16,16 +16,16 @@ function finishTest() {
 function test() {
   waitForExplicitFinish();
 
   let tab = gBrowser.selectedTab = gBrowser.addTab();
   tab.linkedBrowser.addEventListener("load", (function(event) {
     tab.linkedBrowser.removeEventListener("load", arguments.callee, true);
 
     if (BookmarkingUI.status == BookmarkingUI.STATUS_UPDATING) {
-      waitForCondition(function() BookmarkingUI.status != BookmarkingUI.STATUS_UPDATING, finishTest, "BookmarkingUI was updating for too long");
+      waitForCondition(() => BookmarkingUI.status != BookmarkingUI.STATUS_UPDATING, finishTest, "BookmarkingUI was updating for too long");
     } else {
       finishTest();
     }
   }), true);
 
   tab.linkedBrowser.loadURI("http://example.com/browser/browser/base/content/test/general/dummy_page.html");
 }
--- a/browser/base/content/test/general/browser_bug719271.js
+++ b/browser/base/content/test/general/browser_bug719271.js
@@ -64,17 +64,17 @@ function testNavigation() {
     yield waitForNextTurn(); // trying to fix orange bug 806046
     yield FullZoomHelper.navigate(FullZoomHelper.FORWARD);
     FullZoomHelper.zoomTest(gTab1, 1, "Zoom should be 1 again when navigating back to a video");
   }).then(finishTest, FullZoomHelper.failAndContinue(finish));
 }
 
 function waitForNextTurn() {
   let deferred = Promise.defer();
-  setTimeout(function () deferred.resolve(), 0);
+  setTimeout(() => deferred.resolve(), 0);
   return deferred.promise;
 }
 
 var finishTestStarted  = false;
 function finishTest() {
   Task.spawn(function () {
     ok(!finishTestStarted, "finishTest called more than once");
     finishTestStarted = true;
--- a/browser/base/content/test/general/browser_bug763468_perwindowpb.js
+++ b/browser/base/content/test/general/browser_bug763468_perwindowpb.js
@@ -30,17 +30,17 @@ function test() {
   };
 
   function testOnWindow(aOptions, aCallback) {
     whenNewWindowLoaded(aOptions, function(aWin) {
       windowsToClose.push(aWin);
       // execute should only be called when need, like when you are opening
       // web pages on the test. If calling executeSoon() is not necesary, then
       // call whenNewWindowLoaded() instead of testOnWindow() on your test.
-      executeSoon(function() aCallback(aWin));
+      executeSoon(() => aCallback(aWin));
     });
   };
 
    // this function is called after calling finish() on the test.
   registerCleanupFunction(function() {
     windowsToClose.forEach(function(aWin) {
       aWin.close();
     });
--- a/browser/base/content/test/general/browser_bug767836_perwindowpb.js
+++ b/browser/base/content/test/general/browser_bug767836_perwindowpb.js
@@ -40,17 +40,17 @@ function test() {
         aWindow.close();
         aCallback()
       });
     });
   }
 
   function testOnWindow(aIsPrivate, aCallback) {
     whenNewWindowLoaded({private: aIsPrivate}, function(win) {
-      executeSoon(function() aCallback(win));
+      executeSoon(() => aCallback(win));
     });
   }
 
   // check whether any custom new tab url has been configured
   ok(!NewTabURL.overridden, "No custom newtab url is set");
 
   // test normal mode
   testOnWindow(false, function(aWindow) {
--- a/browser/base/content/test/general/browser_bug822367.js
+++ b/browser/base/content/test/general/browser_bug822367.js
@@ -47,17 +47,17 @@ function MixedTest1A() {
   gTestBrowser.addEventListener("load", MixedTest1B, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 function MixedTest1B() {
-  waitForCondition(function() content.document.getElementById('p1').innerHTML == "hello", MixedTest1C, "Waited too long for mixed script to run in Test 1");
+  waitForCondition(() => content.document.getElementById('p1').innerHTML == "hello", MixedTest1C, "Waited too long for mixed script to run in Test 1");
 }
 function MixedTest1C() {
   ok(content.document.getElementById('p1').innerHTML == "hello","Mixed script didn't load in Test 1");
   gTestBrowser.removeEventListener("load", MixedTest1B, true);
   MixedTest2();
 }
 
 //Mixed Display Test - Doorhanger should not appear
@@ -84,20 +84,20 @@ function MixedTest3A() {
   gTestBrowser.addEventListener("load", MixedTest3B, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 function MixedTest3B() {
-  waitForCondition(function() content.document.getElementById('p1').innerHTML == "hello", MixedTest3C, "Waited too long for mixed script to run in Test 3");
+  waitForCondition(() => content.document.getElementById('p1').innerHTML == "hello", MixedTest3C, "Waited too long for mixed script to run in Test 3");
 }
 function MixedTest3C() {
-  waitForCondition(function() content.document.getElementById('p2').innerHTML == "bye", MixedTest3D, "Waited too long for mixed image to load in Test 3");
+  waitForCondition(() => content.document.getElementById('p2').innerHTML == "bye", MixedTest3D, "Waited too long for mixed image to load in Test 3");
 }
 function MixedTest3D() {
   ok(content.document.getElementById('p1').innerHTML == "hello","Mixed script didn't load in Test 3");
   ok(content.document.getElementById('p2').innerHTML == "bye","Mixed image didn't load in Test 3");
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: true});
   MixedTest4();
 }
 
@@ -113,25 +113,25 @@ function MixedTest4A() {
   gTestBrowser.addEventListener("load", MixedTest4B, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 function MixedTest4B() {
-  waitForCondition(function() content.document.location == gHttpTestRoot + "file_bug822367_4B.html", MixedTest4C, "Waited too long for mixed script to run in Test 4");
+  waitForCondition(() => content.document.location == gHttpTestRoot + "file_bug822367_4B.html", MixedTest4C, "Waited too long for mixed script to run in Test 4");
 }
 function MixedTest4C() {
   ok(content.document.location == gHttpTestRoot + "file_bug822367_4B.html", "Location didn't change in test 4");
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
-  waitForCondition(function() content.document.getElementById('p1').innerHTML == "", MixedTest4D, "Mixed script loaded in test 4 after location change!");
+  waitForCondition(() => content.document.getElementById('p1').innerHTML == "", MixedTest4D, "Mixed script loaded in test 4 after location change!");
 }
 function MixedTest4D() {
   ok(content.document.getElementById('p1').innerHTML == "","p1.innerHTML changed; mixed script loaded after location change in Test 4");
   MixedTest5();
 }
 
 // Mixed script attempts to load in a document.open()
 function MixedTest5() {
@@ -145,17 +145,17 @@ function MixedTest5A() {
   gTestBrowser.addEventListener("load", MixedTest5B, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 function MixedTest5B() {
-  waitForCondition(function() content.document.getElementById('p1').innerHTML == "hello", MixedTest5C, "Waited too long for mixed script to run in Test 5");
+  waitForCondition(() => content.document.getElementById('p1').innerHTML == "hello", MixedTest5C, "Waited too long for mixed script to run in Test 5");
 }
 function MixedTest5C() {
   ok(content.document.getElementById('p1').innerHTML == "hello","Mixed script didn't load in Test 5");
   MixedTest6();
 }
 
 // Mixed script attempts to load in a document.open() that is within an iframe.
 function MixedTest6() {
--- a/browser/base/content/test/general/browser_bug902156.js
+++ b/browser/base/content/test/general/browser_bug902156.js
@@ -55,17 +55,17 @@ function test1A() {
   // Disable Mixed Content Protection for the page (and reload)
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 
 function test1B() {
   var expected = "Mixed Content Blocker disabled";
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test1C, "Error: Waited too long for mixed script to run in Test 1B");
 }
 
 function test1C() {
   gTestBrowser.removeEventListener("load", test1B, true);
   var actual = content.document.getElementById('mctestdiv').innerHTML;
   is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 1C");
 
@@ -110,17 +110,17 @@ function test2A() {
   // Disable Mixed Content Protection for the page (and reload)
   let {gIdentityHandler} = gTestBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 
 function test2B() {
   var expected = "Mixed Content Blocker disabled";
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test2C, "Error: Waited too long for mixed script to run in Test 2B");
 }
 
 function test2C() {
   gTestBrowser.removeEventListener("load", test2B, true);
   var actual = content.document.getElementById('mctestdiv').innerHTML;
   is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 2C");
 
--- a/browser/base/content/test/general/browser_bug906190.js
+++ b/browser/base/content/test/general/browser_bug906190.js
@@ -149,17 +149,17 @@ function checkPopUpNotification() {
   // Disable Mixed Content Protection for the page (which reloads the page)
   let {gIdentityHandler} = gTestWin.gBrowser.ownerGlobal;
   gIdentityHandler.disableMixedContentProtection();
 }
 
 function reloadedTabAfterDisablingMCB() {
   var expected = "Mixed Content Blocker disabled";
   waitForCondition(
-    function() gTestWin.content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => gTestWin.content.document.getElementById('mctestdiv').innerHTML == expected,
     makeSureMCBisDisabled, "Error: Waited too long for mixed script to run in " + curTestName + "!");
 }
 
 function makeSureMCBisDisabled() {
   var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
   is(actual, "Mixed Content Blocker disabled", "OK: Made sure MCB is disabled in " + curTestName + "!");
 
   // inject the provided link into the page, so we can test persistence of MCB
--- a/browser/base/content/test/general/browser_contentAreaClick.js
+++ b/browser/base/content/test/general/browser_contentAreaClick.js
@@ -213,17 +213,17 @@ var gClickHandler = {
     // Check that all required methods have been called.
     gCurrentTest.expectedInvokedMethods.forEach(function(aExpectedMethodName) {
       isnot(gInvokedMethods.indexOf(aExpectedMethodName), -1,
             gCurrentTest.desc + ":" + aExpectedMethodName + " was invoked");
     });
     
     if (gInvokedMethods.length != gCurrentTest.expectedInvokedMethods.length) {
       ok(false, "Wrong number of invoked methods");
-      gInvokedMethods.forEach(function (method) info(method + " was invoked"));
+      gInvokedMethods.forEach(method => info(method + " was invoked"));
     }
 
     event.preventDefault();
     event.stopPropagation();
 
     executeSoon(runNextTest);
   }
 }
--- a/browser/base/content/test/general/browser_ctrlTab.js
+++ b/browser/base/content/test/general/browser_ctrlTab.js
@@ -85,24 +85,27 @@ function test() {
   }
 
   // cleanup
   if (gPrefService.prefHasUserValue("browser.ctrlTab.previews"))
     gPrefService.clearUserPref("browser.ctrlTab.previews");
 
   /* private utility functions */
 
-  function pressCtrlTab(aShiftKey)
+  function pressCtrlTab(aShiftKey) {
     EventUtils.synthesizeKey("VK_TAB", { ctrlKey: true, shiftKey: !!aShiftKey });
+  }
 
-  function releaseCtrl()
+  function releaseCtrl() {
     EventUtils.synthesizeKey("VK_CONTROL", { type: "keyup" });
+  }
 
-  function isOpen()
-    ctrlTab.isOpen;
+  function isOpen() {
+    return ctrlTab.isOpen;
+  }
 
   function checkTabs(aTabs) {
     var tabs = gBrowser.tabs.length;
     if (tabs != aTabs) {
       while (gBrowser.tabs.length > 1)
         gBrowser.removeCurrentTab();
       throw "expected " + aTabs + " open tabs, got " + tabs;
     }
--- a/browser/base/content/test/general/browser_discovery.js
+++ b/browser/base/content/test/general/browser_discovery.js
@@ -1,11 +1,13 @@
 var browser;
 
-function doc() browser.contentDocument;
+function doc() {
+  return browser.contentDocument;
+}
 
 function setHandlerFunc(aResultFunc) {
   gBrowser.addEventListener("DOMLinkAdded", function (event) {
     gBrowser.removeEventListener("DOMLinkAdded", arguments.callee, false);
     executeSoon(aResultFunc);
   }, false);
 }
 
--- a/browser/base/content/test/general/browser_gestureSupport.js
+++ b/browser/base/content/test/general/browser_gestureSupport.js
@@ -278,17 +278,17 @@ function test_emitLatchedEvents(eventPre
   let cumulativeDelta = 0;
   let isIncreasing = initialDelta > 0;
 
   let expect = {};
   // Reset the call counters and initialize expected values
   for (let dir in cmd)
     cmd[dir].callCount = expect[dir] = 0;
 
-  let check = function(aDir, aMsg) ok(cmd[aDir].callCount == expect[aDir], aMsg);
+  let check = (aDir, aMsg) => ok(cmd[aDir].callCount == expect[aDir], aMsg);
   let checkBoth = function(aNum, aInc, aDec) {
     let prefix = "Step " + aNum + ": ";
     check("inc", prefix + aInc);
     check("dec", prefix + aDec);
   };
 
   // Send the "Start" event.
   test_utils.sendSimpleGestureEvent(eventPrefix + "Start", 0, 0, 0, initialDelta, 0);
--- a/browser/base/content/test/general/browser_hide_removing.js
+++ b/browser/base/content/test/general/browser_hide_removing.js
@@ -19,17 +19,21 @@ function test() {
     // While the next tab is being selected, hide the removing tab
     numVisBeforeHide = gBrowser.visibleTabs.length;
     gBrowser.hideTab(testTab);
     numVisAfterHide = gBrowser.visibleTabs.length;
   }, false);
   gBrowser.removeTab(testTab, {animate: true});
 
   // Make sure the tab gets removed at the end of the animation by polling
-  (function checkRemoved() setTimeout(function() {
-    if (gBrowser.tabs.length != 1)
-      return checkRemoved();
+  (function checkRemoved() {
+    return setTimeout(function() {
+      if (gBrowser.tabs.length != 1) {
+        checkRemoved();
+        return;
+      }
 
-    is(numVisBeforeHide, 1, "animated remove has in 1 tab left");
-    is(numVisAfterHide, 1, "hiding a removing tab is also has 1 tab");
-    finish();
-  }, 50))();
+      is(numVisBeforeHide, 1, "animated remove has in 1 tab left");
+      is(numVisAfterHide, 1, "hiding a removing tab is also has 1 tab");
+      finish();
+    }, 50);
+  })();
 }
--- a/browser/base/content/test/general/browser_mcb_redirect.js
+++ b/browser/base/content/test/general/browser_mcb_redirect.js
@@ -107,17 +107,17 @@ function test1() {
 
 function checkUIForTest1() {
   gTestBrowser.removeEventListener("load", checkUIForTest1, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
 
   var expected = "script blocked";
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test2, "Error: Waited too long for status in Test 1!",
     "OK: Expected result in innerHTML for Test1!");
 }
 
 //------------------------ Test 2 ------------------------------
 
 function test2() {
   gTestBrowser.addEventListener("load", checkUIForTest2, true);
@@ -127,17 +127,17 @@ function test2() {
 
 function checkUIForTest2() {
   gTestBrowser.removeEventListener("load", checkUIForTest2, true);
 
   assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: false, passiveLoaded: false});
 
   var expected = "script executed";
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test3, "Error: Waited too long for status in Test 2!",
     "OK: Expected result in innerHTML for Test2!");
 }
 
 //------------------------ Test 3 ------------------------------
 // HTTPS page loading insecure image
 function test3() {
   gTestBrowser.addEventListener("load", checkLoadEventForTest3, true);
@@ -145,17 +145,17 @@ function test3() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest3() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest3, true);
 
   var expected = "image blocked"
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test4, "Error: Waited too long for status in Test 3!",
     "OK: Expected result in innerHTML for Test3!");
 }
 
 //------------------------ Test 4 ------------------------------
 // HTTP page loading insecure image
 function test4() {
   gTestBrowser.addEventListener("load", checkLoadEventForTest4, true);
@@ -163,17 +163,17 @@ function test4() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest4() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest4, true);
 
   var expected = "image loaded"
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test5, "Error: Waited too long for status in Test 4!",
     "OK: Expected result in innerHTML for Test4!");
 }
 
 //------------------------ Test 5 ------------------------------
 // HTTP page laoding insecure cached image
 // Assuming test 4 succeeded, the image has already been loaded once
 // and hence should be cached per the sjs cache-control header
@@ -186,17 +186,17 @@ function test5() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest5() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest5, true);
 
   var expected = "image loaded"
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test6, "Error: Waited too long for status in Test 5!",
     "OK: Expected result in innerHTML for Test5!");
   // Go back online
   Services.io.offline = false;
 }
 
 //------------------------ Test 6 ------------------------------
 // HTTPS page loading insecure cached image
@@ -211,17 +211,17 @@ function test6() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest6() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest6, true);
 
   var expected = "image blocked"
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test7, "Error: Waited too long for status in Test 6!",
     "OK: Expected result in innerHTML for Test6!");
   // Go back online
   Services.io.offline = false;
 }
 
 //------------------------ Test 7 ------------------------------
 // HTTP page loading insecure image that went through a double redirect
@@ -231,17 +231,17 @@ function test7() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest7() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest7, true);
 
   var expected = "image loaded"
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test8, "Error: Waited too long for status in Test 7!",
     "OK: Expected result in innerHTML for Test7!");
 }
 
 //------------------------ Test 8 ------------------------------
 // HTTP page loading insecure cached image that went through a double redirect
 // Assuming test 7 succeeded, the image has already been loaded once
 // and hence should be cached per the sjs cache-control header
@@ -254,17 +254,17 @@ function test8() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest8() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest8, true);
 
   var expected = "image loaded"
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     test9, "Error: Waited too long for status in Test 8!",
     "OK: Expected result in innerHTML for Test8!");
   // Go back online
   Services.io.offline = false;
 }
 
 //------------------------ Test 9 ------------------------------
 // HTTPS page loading insecure cached image that went through a double redirect
@@ -279,17 +279,17 @@ function test9() {
   gTestBrowser.contentWindow.location = url;
 }
 
 function checkLoadEventForTest9() {
   gTestBrowser.removeEventListener("load", checkLoadEventForTest9, true);
 
   var expected = "image blocked"
   waitForCondition(
-    function() content.document.getElementById('mctestdiv').innerHTML == expected,
+    () => content.document.getElementById('mctestdiv').innerHTML == expected,
     cleanUpAfterTests, "Error: Waited too long for status in Test 9!",
     "OK: Expected result in innerHTML for Test9!");
   // Go back online
   Services.io.offline = false;
 }
 
 //------------------------ SETUP ------------------------------
 
--- a/browser/base/content/test/general/browser_no_mcb_on_http_site.js
+++ b/browser/base/content/test/general/browser_no_mcb_on_http_site.js
@@ -64,17 +64,17 @@ function waitForCondition(condition, nex
 //------------- TEST 1 -----------------------------------------
 
 function test1A() {
   gTestBrowser.removeEventListener("load", test1A, true);
 
   var expected = "Verifying MCB does not trigger warning/error for an http page ";
   expected += "with https css that includes http image";
   waitForCondition(
-    function() content.document.getElementById('testDiv').innerHTML == expected,
+    () => content.document.getElementById('testDiv').innerHTML == expected,
     test1B, "Error: Waited too long for status in Test 1!",
     "OK: Expected result in innerHTML!");
 }
 
 function test1B() {
   // set up test 2
   gTestBrowser.addEventListener("load", test2A, true);
   var url = gHttpTestRoot + "test_no_mcb_on_http_site_font.html";
@@ -84,17 +84,17 @@ function test1B() {
 //------------- TEST 2 -----------------------------------------
 
 function test2A() {
   gTestBrowser.removeEventListener("load", test2A, true);
 
   var expected = "Verifying MCB does not trigger warning/error for an http page ";
   expected += "with https css that includes http font";
   waitForCondition(
-    function() content.document.getElementById('testDiv').innerHTML == expected,
+    () => content.document.getElementById('testDiv').innerHTML == expected,
     test2B, "Error: Waited too long for status in Test 2!",
     "OK: Expected result in innerHTML!");
 }
 
 function test2B() {
   // set up test 3
   gTestBrowser.addEventListener("load", test3, true);
   var url = gHttpTestRoot + "test_no_mcb_on_http_site_font2.html";
@@ -104,17 +104,17 @@ function test2B() {
 //------------- TEST 3 -----------------------------------------
 
 function test3() {
   gTestBrowser.removeEventListener("load", test3, true);
 
   var expected = "Verifying MCB does not trigger warning/error for an http page "
   expected += "with https css that imports another http css which includes http font";
   waitForCondition(
-    function() content.document.getElementById('testDiv').innerHTML == expected,
+    () => content.document.getElementById('testDiv').innerHTML == expected,
     cleanUpAfterTests, "Error: Waited too long for status in Test 3!",
     "OK: Expected result in innerHTML!");
 }
 
 //------------------------------------------------------
 
 function test() {
   // Performing async calls, e.g. 'onload', we have to wait till all of them finished
--- a/browser/base/content/test/general/browser_overflowScroll.js
+++ b/browser/base/content/test/general/browser_overflowScroll.js
@@ -1,23 +1,23 @@
 var tabstrip = gBrowser.tabContainer.mTabstrip;
 var scrollbox = tabstrip._scrollbox;
 var originalSmoothScroll = tabstrip.smoothScroll;
 var tabs = gBrowser.tabs;
 
-function rect(ele)           ele.getBoundingClientRect();
-function width(ele)          rect(ele).width;
-function left(ele)           rect(ele).left;
-function right(ele)          rect(ele).right;
-function isLeft(ele, msg)    is(left(ele) + tabstrip._tabMarginLeft, left(scrollbox), msg);
-function isRight(ele, msg)   is(right(ele) - tabstrip._tabMarginRight, right(scrollbox), msg);
-function elementFromPoint(x) tabstrip._elementFromPoint(x);
-function nextLeftElement()   elementFromPoint(left(scrollbox) - 1);
-function nextRightElement()  elementFromPoint(right(scrollbox) + 1);
-function firstScrollable()   tabs[gBrowser._numPinnedTabs];
+let rect = ele => ele.getBoundingClientRect();
+let width = ele => rect(ele).width;
+let left = ele => rect(ele).left;
+let right = ele => rect(ele).right;
+let isLeft = (ele, msg) => is(left(ele) + tabstrip._tabMarginLeft, left(scrollbox), msg);
+let isRight = (ele, msg) => is(right(ele) - tabstrip._tabMarginRight, right(scrollbox), msg);
+let elementFromPoint = x => tabstrip._elementFromPoint(x);
+let nextLeftElement = () => elementFromPoint(left(scrollbox) - 1);
+let nextRightElement = () => elementFromPoint(right(scrollbox) + 1);
+let firstScrollable = () => tabs[gBrowser._numPinnedTabs];
 
 function test() {
   requestLongerTimeout(2);
   waitForExplicitFinish();
 
   // If the previous (or more) test finished with cleaning up the tabs,
   // there may be some pending animations. That can cause a failure of
   // this tests, so, we should test this in another stack.
--- a/browser/base/content/test/general/browser_page_style_menu.js
+++ b/browser/base/content/test/general/browser_page_style_menu.js
@@ -27,17 +27,17 @@ function checkPageStyleMenu() {
   Array.forEach(content.document.getElementsByTagName("link"), function (link) {
     var title = link.getAttribute("title");
     var rel = link.getAttribute("rel");
     var media = link.getAttribute("media");
     var idstring = "link " + (title ? title : "without title and") +
                    " with rel=\"" + rel + "\"" +
                    (media ? " and media=\"" + media + "\"" : "");
 
-    var item = items.filter(function (item) item.getAttribute("label") == title);
+    var item = items.filter(item => item.getAttribute("label") == title);
     var found = item.length == 1;
     var checked = found && (item[0].getAttribute("checked") == "true");
 
     switch (link.getAttribute("data-state")) {
       case "0":
         ok(!found, idstring + " does not show up in page style menu");
         break;
       case "0-todo":
--- a/browser/base/content/test/general/browser_permissions.js
+++ b/browser/base/content/test/general/browser_permissions.js
@@ -25,16 +25,21 @@ add_task(function* testMainViewVisible()
   ok(!is_hidden(emptyLabel), "List of permissions is empty");
   gIdentityHandler._identityPopup.hidden = true;
 
   gIdentityHandler.setPermission("install", 1);
 
   gIdentityHandler._identityBox.click();
   ok(is_hidden(emptyLabel), "List of permissions is not empty");
 
+  let labelText = SitePermissions.getPermissionLabel("install");
+  let labels = permissionsList.querySelectorAll(".identity-popup-permission-label");
+  is(labels.length, 1, "One permission visible in main view");
+  is(labels[0].textContent, labelText, "Correct value");
+
   let menulists = permissionsList.querySelectorAll("menulist");
   is(menulists.length, 1, "One permission visible in main view");
   is(menulists[0].id, "identity-popup-permission:install", "Install permission visible");
   is(menulists[0].value, "1", "Correct value on install menulist");
   gIdentityHandler._identityPopup.hidden = true;
 
   gIdentityHandler.setPermission("install", SitePermissions.getDefault("install"));
 
--- a/browser/base/content/test/general/browser_pinnedTabs.js
+++ b/browser/base/content/test/general/browser_pinnedTabs.js
@@ -1,11 +1,13 @@
 var tabs;
 
-function index(tab) Array.indexOf(gBrowser.tabs, tab);
+function index(tab) {
+  return Array.indexOf(gBrowser.tabs, tab);
+}
 
 function indexTest(tab, expectedIndex, msg) {
   var diag = "tab " + tab + " should be at index " + expectedIndex;
   if (msg)
     msg = msg + " (" + diag + ")";
   else
     msg = diag;
   is(index(tabs[tab]), expectedIndex, msg);
--- a/browser/base/content/test/general/browser_sanitize-timespans.js
+++ b/browser/base/content/test/general/browser_sanitize-timespans.js
@@ -54,17 +54,17 @@ function test() {
 function countEntries(name, message, check) {
   let deferred = Promise.defer();
 
   var obj = {};
   if (name !== null)
     obj.fieldname = name;
 
   let count;
-  FormHistory.count(obj, { handleResult: function (result) count = result,
+  FormHistory.count(obj, { handleResult: result => count = result,
                            handleError: function (error) {
                              do_throw("Error occurred searching form history: " + error);
                              deferred.reject(error)
                            },
                            handleCompletion: function (reason) {
                              if (!reason) {
                                check(count, message);
                                deferred.resolve();
@@ -467,31 +467,31 @@ function setupHistory() {
   today.setSeconds(1);
   addPlace(makeURI("http://today.com/"), "Today", today.getTime() * 1000);
 
   let lastYear = new Date();
   lastYear.setFullYear(lastYear.getFullYear() - 1);
   addPlace(makeURI("http://before-today.com/"), "Before Today", lastYear.getTime() * 1000);
 
   PlacesUtils.asyncHistory.updatePlaces(places, {
-    handleError: function () ok(false, "Unexpected error in adding visit."),
-    handleResult: function () { },
-    handleCompletion: function () deferred.resolve()
+    handleError: () => ok(false, "Unexpected error in adding visit."),
+    handleResult: () => { },
+    handleCompletion: () => deferred.resolve()
   });
 
   return deferred.promise;
 }
 
 function setupFormHistory() {
 
   function searchEntries(terms, params) {
     let deferred = Promise.defer();
 
     let results = [];
-    FormHistory.search(terms, params, { handleResult: function (result) results.push(result),
+    FormHistory.search(terms, params, { handleResult: result => results.push(result),
                                         handleError: function (error) {
                                           do_throw("Error occurred searching form history: " + error);
                                           deferred.reject(error);
                                         },
                                         handleCompletion: function (reason) { deferred.resolve(results); }
                                       });
     return deferred.promise;
   }
--- a/browser/base/content/test/general/browser_sanitizeDialog.js
+++ b/browser/base/content/test/general/browser_sanitizeDialog.js
@@ -972,17 +972,17 @@ function promiseAddFormEntryWithMinutesA
  * Checks if a form entry exists.
  */
 function formNameExists(name)
 {
   let deferred = Promise.defer();
 
   let count = 0;
   FormHistory.count({ fieldname: name },
-                    { handleResult: function (result) count = result,
+                    { handleResult: result => count = result,
                       handleError: function (error) {
                         do_throw("Error occurred searching form history: " + error);
                         deferred.reject(error);
                       },
                       handleCompletion: function (reason) {
                           if (!reason) deferred.resolve(count);
                       }
                     });
--- a/browser/base/content/test/general/browser_save_link-perwindowpb.js
+++ b/browser/base/content/test/general/browser_save_link-perwindowpb.js
@@ -75,17 +75,17 @@ function triggerSave(aWindow, aCallback)
     event.target.hidePopup();
     info("popup hidden");
   }
 
   function onTransferComplete(aWindow, downloadSuccess, destDir) {
     ok(downloadSuccess, "Link should have been downloaded successfully");
     aWindow.close();
 
-    executeSoon(function() aCallback());
+    executeSoon(() => aCallback());
   }
 }
 
 function test() {
   info("Start the test");
   waitForExplicitFinish();
 
   var gNumSet = 0;
--- a/browser/base/content/test/general/browser_save_private_link_perwindowpb.js
+++ b/browser/base/content/test/general/browser_save_private_link_perwindowpb.js
@@ -111,17 +111,17 @@ function test() {
   }
 
   function testOnWindow(aOptions, aCallback) {
     whenNewWindowLoaded(aOptions, function(aWin) {
       windowsToClose.push(aWin);
       // execute should only be called when need, like when you are opening
       // web pages on the test. If calling executeSoon() is not necesary, then
       // call whenNewWindowLoaded() instead of testOnWindow() on your test.
-      executeSoon(function() aCallback(aWin));
+      executeSoon(() => aCallback(aWin));
     });
   };
 
    // this function is called after calling finish() on the test.
   registerCleanupFunction(function() {
     windowsToClose.forEach(function(aWin) {
       aWin.close();
     });
--- a/browser/base/content/test/general/browser_tabMatchesInAwesomebar.js
+++ b/browser/base/content/test/general/browser_tabMatchesInAwesomebar.js
@@ -216,17 +216,17 @@ function checkAutocompleteResults(aExpec
       for (let entry in aExpected) {
         ok(false, "'" + entry + "' should be found in autocomplete");
       }
 
       executeSoon(aCallback);
     },
     setSelectedIndex: function() {},
     get searchCount() { return this.searches.length; },
-    getSearchAt: function(aIndex) this.searches[aIndex],
+    getSearchAt: function(aIndex) { return this.searches[aIndex]; },
     QueryInterface: XPCOMUtils.generateQI([
       Ci.nsIAutoCompleteInput,
       Ci.nsIAutoCompletePopup,
     ])
   };
 
   info("Searching open pages.");
   gController.startSearch(Services.prefs.getCharPref("browser.urlbar.restrict.openpage"));
--- a/browser/base/content/test/general/browser_tabMatchesInAwesomebar_perwindowpb.js
+++ b/browser/base/content/test/general/browser_tabMatchesInAwesomebar_perwindowpb.js
@@ -7,17 +7,17 @@ function test() {
 
   let testURL = "http://example.org/browser/browser/base/content/test/general/dummy_page.html";
 
   function testOnWindow(aOptions, aCallback) {
     whenNewWindowLoaded(aOptions, function(aWin) {
       // execute should only be called when need, like when you are opening
       // web pages on the test. If calling executeSoon() is not necesary, then
       // call whenNewWindowLoaded() instead of testOnWindow() on your test.
-      executeSoon(function() aCallback(aWin));
+      executeSoon(() => aCallback(aWin));
     });
   };
 
   testOnWindow({}, function(aNormalWindow) {
     testOnWindow({private: true}, function(aPrivateWindow) {
       runTest(aNormalWindow, aPrivateWindow, false, function() {
         aNormalWindow.close();
         aPrivateWindow.close();
--- a/browser/base/content/test/general/browser_tabfocus.js
+++ b/browser/base/content/test/general/browser_tabfocus.js
@@ -201,17 +201,17 @@ add_task(function*() {
                          "focusedWindow after blur in unfocused tab");
 
   focused = yield getFocusedElementForBrowser(browser1, true);
   is(focused, "Focus is <none>", "focusedElement in first browser after focus in unfocused tab");
   focused = yield getFocusedElementForBrowser(browser2, false);
   is(focused, "Focus is button2", "focusedElement in second browser after focus in unfocused tab");
 
   // When focus is in the tab bar, it should be retained there
-  yield expectFocusShift(function () gBrowser.selectedTab.focus(),
+  yield expectFocusShift(() => gBrowser.selectedTab.focus(),
                          "main-window", "tab2", true,
                          "focusing tab element");
   yield* expectFocusShiftAfterTabSwitch(tab1, "main-window", "tab1", true,
                                         "tab change when selected tab element was focused");
 
   let switchWaiter;
   if (gMultiProcessBrowser) {
     switchWaiter = new Promise((resolve, reject) => {
@@ -228,33 +228,33 @@ add_task(function*() {
   // When this a remote browser, wait for the paint on the second browser so that
   // any post tab-switching stuff has time to complete before blurring the tab.
   // Otherwise, the _adjustFocusAfterTabSwitch in tabbrowser gets confused and
   // isn't sure what tab is really focused.
   if (gMultiProcessBrowser) {
     yield switchWaiter;
   }
 
-  yield expectFocusShift(function () gBrowser.selectedTab.blur(),
+  yield expectFocusShift(() => gBrowser.selectedTab.blur(),
                          "main-window", null, true,
                          "blurring tab element");
 
   // focusing the url field should switch active focus away from the browser but
   // not clear what would be the focus in the browser
   focusElementInChild("button1", "focus");
 
-  yield expectFocusShift(function () gURLBar.focus(),
+  yield expectFocusShift(() => gURLBar.focus(),
                          "main-window", "urlbar", true,
                          "focusedWindow after url field focused");
   focused = yield getFocusedElementForBrowser(browser1, true);
   is(focused, "Focus is button1", "focusedElement after url field focused, first browser");
   focused = yield getFocusedElementForBrowser(browser2, true);
   is(focused, "Focus is button2", "focusedElement after url field focused, second browser");
 
-  yield expectFocusShift(function () gURLBar.blur(),
+  yield expectFocusShift(() => gURLBar.blur(),
                          "main-window", null, true,
                          "blurring url field");
 
   // when a chrome element is focused, switching tabs to a tab with a button
   // with the current focus should focus the button
   yield* expectFocusShiftAfterTabSwitch(tab1, "window1", "button1", true,
                                         "after tab change, focus in url field, button focused in new tab");
 
@@ -269,32 +269,32 @@ add_task(function*() {
                          "after blur in focused tab");
 
   focused = yield getFocusedElementForBrowser(browser1, false);
   is(focused, "Focus is <none>", "focusedWindow after blur in focused tab, child");
   focusedWindow = {};
   is(fm.getFocusedElementForWindow(window, false, focusedWindow), browser1, "focusedElement after blur in focused tab, parent");
 
   // blurring an non-focused url field should have no effect
-  yield expectFocusShift(function () gURLBar.blur(),
+  yield expectFocusShift(() => gURLBar.blur(),
                          "window1", null, false,
                          "after blur in unfocused url field");
 
   focusedWindow = {};
   is(fm.getFocusedElementForWindow(window, false, focusedWindow), browser1, "focusedElement after blur in unfocused url field");
 
   // switch focus to a tab with a currently focused element
   yield* expectFocusShiftAfterTabSwitch(tab2, "window2", "button2", true,
                                         "after switch from unfocused to focused tab");
   focused = yield getFocusedElementForBrowser(browser2, true);
   is(focused, "Focus is button2", "focusedElement after switch from unfocused to focused tab");
 
   // clearing focus on the chrome window should switch the focus to the
   // chrome window
-  yield expectFocusShift(function () fm.clearFocus(window),
+  yield expectFocusShift(() => fm.clearFocus(window),
                          "main-window", null, true,
                          "after switch to chrome with no focused element");
 
   focusedWindow = {};
   is(fm.getFocusedElementForWindow(window, false, focusedWindow), null, "focusedElement after switch to chrome with no focused element");
 
   // switch focus to another tab when neither have an active focus
   yield* expectFocusShiftAfterTabSwitch(tab1, "window1", null, true,
@@ -328,17 +328,17 @@ add_task(function*() {
 
   // Document navigation with F6 does not yet work in mutli-process browsers.
   if (!gMultiProcessBrowser) {
     gURLBar.focus();
     actualEvents = [];
     _browser_tabfocus_test_lastfocus = "urlbar";
     _browser_tabfocus_test_lastfocuswindow = "main-window";
 
-    yield expectFocusShift(function () EventUtils.synthesizeKey("VK_F6", { }),
+    yield expectFocusShift(() => EventUtils.synthesizeKey("VK_F6", { }),
                            "window1", "html1",
                            true, "switch document forward with f6");
 
     EventUtils.synthesizeKey("VK_F6", { });
     is(fm.focusedWindow, window, "switch document forward again with f6");
 
     browser1.style.MozUserFocus = "ignore";
     browser1.clientWidth;
--- a/browser/base/content/test/general/browser_windowopen_reflows.js
+++ b/browser/base/content/test/general/browser_windowopen_reflows.js
@@ -24,17 +24,17 @@ const EXPECTED_REFLOWS = [
   // (https://bugzilla.mozilla.org/show_bug.cgi?id=892154 will fix this)
   "ssi_getWindowDimension@resource:///modules/sessionstore/SessionStore.jsm",
 ];
 
 if (Services.appinfo.OS == "WINNT" || Services.appinfo.OS == "Darwin") {
   // TabsInTitlebar._update causes a reflow on OS X and Windows trying to do calculations
   // since layout info is already dirty. This doesn't seem to happen before
   // MozAfterPaint on Linux.
-  EXPECTED_REFLOWS.push("rect@chrome://browser/content/browser.js|" +
+  EXPECTED_REFLOWS.push("TabsInTitlebar._update/rect@chrome://browser/content/browser.js|" +
                           "TabsInTitlebar._update@chrome://browser/content/browser.js|" +
                           "updateAppearance@chrome://browser/content/browser.js|" +
                           "handleEvent@chrome://browser/content/tabbrowser.xml|");
 }
 
 if (Services.appinfo.OS == "Darwin") {
   // _onOverflow causes a reflow getting widths.
   EXPECTED_REFLOWS.push("OverflowableToolbar.prototype._onOverflow@resource:///modules/CustomizableUI.jsm|" +
--- a/browser/base/content/test/newtab/browser_newtab_bug722273.js
+++ b/browser/base/content/test/newtab/browser_newtab_bug722273.js
@@ -41,17 +41,17 @@ function promiseAddFakeVisits() {
   }
   let place = {
     uri: makeURI(URL),
     title: "fake site",
     visits: visits
   };
   return new Promise((resolve, reject) => {
     PlacesUtils.asyncHistory.updatePlaces(place, {
-      handleError: function () reject(new Error("Couldn't add visit")),
+      handleError: () => reject(new Error("Couldn't add visit")),
       handleResult: function () {},
       handleCompletion: function () {
         NewTabUtils.links.populateCache(function () {
           NewTabUtils.allPages.update();
           resolve();
         }, true);
       }
     });
--- a/browser/base/content/test/newtab/head.js
+++ b/browser/base/content/test/newtab/head.js
@@ -305,17 +305,17 @@ function fillHistory(aLinks, aCallback =
       title: link.title,
       // Links are secondarily sorted by visit date descending, so decrease the
       // visit date as we progress through the array so that links appear in the
       // grid in the order they're present in the array.
       visits: [{visitDate: now - i, transitionType: transitionLink}]
     };
 
     PlacesUtils.asyncHistory.updatePlaces(place, {
-      handleError: function () ok(false, "couldn't add visit to history"),
+      handleError: () => ok(false, "couldn't add visit to history"),
       handleResult: function () {},
       handleCompletion: function () {
         if (--numLinks == 0 && aCallback)
           aCallback();
       }
     });
   }
 }
--- a/browser/base/content/test/plugins/browser_CTP_data_urls.js
+++ b/browser/base/content/test/plugins/browser_CTP_data_urls.js
@@ -63,17 +63,17 @@ add_task(function* () {
     let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindowUtils);
     utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
     utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
   });
   yield promise;
 
   // Simulate clicking the "Allow Always" button.
-  let condition = function() !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
+  let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
     PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
   PopupNotifications.panel.firstChild._primaryButton.click();
 
   // check plugin state
   pluginInfo = yield promiseForPluginInfo("test");
   ok(pluginInfo.activated, "Test 1b, plugin should be activated");
 });
@@ -180,17 +180,17 @@ add_task(function* () {
     let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindowUtils);
     utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
     utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
   });
   yield promise;
 
   // Simulate clicking the "Allow Always" button.
-  let condition = function() !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
+  let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
     PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
   PopupNotifications.panel.firstChild._primaryButton.click();
 
   // check plugin state
   pluginInfo = yield promiseForPluginInfo("test");
   ok(pluginInfo.activated, "Test 3a, plugin should be activated");
 
@@ -238,17 +238,17 @@ add_task(function* () {
     let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindowUtils);
     utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
     utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
   });
   yield promise;
 
   // Simulate clicking the "Allow Always" button.
-  let condition = function() !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
+  let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
     PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
   PopupNotifications.panel.firstChild._primaryButton.click();
 
   // check plugin state
   pluginInfo = yield promiseForPluginInfo("test");
   ok(pluginInfo.activated, "Test 4a, plugin should be activated");
 });
--- a/browser/base/content/test/plugins/browser_CTP_drag_drop.js
+++ b/browser/base/content/test/plugins/browser_CTP_drag_drop.js
@@ -78,17 +78,17 @@ add_task(function* () {
     let left = (bounds.left + bounds.right) / 2;
     let top = (bounds.top + bounds.bottom) / 2;
     let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindowUtils);
     utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
     utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
   });
 
-  let condition = function() !PopupNotifications.getNotification("click-to-play-plugins", gNewWindow.gBrowser.selectedBrowser).dismissed && gNewWindow.PopupNotifications.panel.firstChild;
+  let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gNewWindow.gBrowser.selectedBrowser).dismissed && gNewWindow.PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
 });
 
 add_task(function* () {
   // Click the activate button on doorhanger to make sure it works
   gNewWindow.PopupNotifications.panel.firstChild._primaryButton.click();
 
   let pluginInfo = yield promiseForPluginInfo("test", gNewWindow.gBrowser.selectedBrowser);
--- a/browser/base/content/test/plugins/browser_bug787619.js
+++ b/browser/base/content/test/plugins/browser_bug787619.js
@@ -47,17 +47,17 @@ add_task(function* () {
     utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
   });
   yield promise;
 
   // check plugin state
   pluginInfo = yield promiseForPluginInfo("plugin");
   ok(!pluginInfo.activated, "1b plugin should not be activated");
 
-  let condition = function() !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
+  let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
     PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
   PopupNotifications.panel.firstChild._primaryButton.click();
 
   // check plugin state
   pluginInfo = yield promiseForPluginInfo("plugin");
   ok(pluginInfo.activated, "plugin should be activated");
 
--- a/browser/base/content/test/plugins/browser_pluginnotification.js
+++ b/browser/base/content/test/plugins/browser_pluginnotification.js
@@ -234,17 +234,17 @@ add_task(function* () {
     let left = (bounds.left + bounds.right) / 2;
     let top = (bounds.top + bounds.bottom) / 2;
     let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindowUtils);
     utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
     utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
   });
 
-  let condition = function() !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed;
+  let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed;
   yield promiseForCondition(condition);
 });
 
 // Tests that clicking the text of the overlay activates the plugin
 add_task(function* () {
   yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
 
   // Work around for delayed PluginBindingAttached
@@ -264,17 +264,17 @@ add_task(function* () {
     let left = (bounds.left + bounds.right) / 2;
     let top = (bounds.top + bounds.bottom) / 2;
     let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindowUtils);
     utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
     utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
   });
 
-  let condition = function() !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed;
+  let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed;
   yield promiseForCondition(condition);
 });
 
 // Tests that clicking the box of the overlay activates the doorhanger
 // (just to be thorough)
 add_task(function* () {
   yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
 
@@ -291,17 +291,17 @@ add_task(function* () {
     let doc = content.document;
     let plugin = doc.getElementById("test");
     let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindowUtils);
     utils.sendMouseEvent("mousedown", 50, 50, 0, 1, 0, false, 0, 0);
     utils.sendMouseEvent("mouseup", 50, 50, 0, 1, 0, false, 0, 0);
   });
 
-  let condition = function() !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
+  let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
     PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
   PopupNotifications.panel.firstChild._primaryButton.click();
 
   pluginInfo = yield promiseForPluginInfo("test");
   ok(pluginInfo.activated, "Test 19e, Plugin should not be activated");
 
   clearAllPluginPermissions();
@@ -374,17 +374,17 @@ add_task(function* () {
     let left = (bounds.left + bounds.right) / 2;
     let top = (bounds.top + bounds.bottom) / 2;
     let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindowUtils);
     utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
     utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
   });
 
-  let condition = function() !notification.dismissed && !!PopupNotifications.panel.firstChild;
+  let condition = () => !notification.dismissed && !!PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
   PopupNotifications.panel.firstChild._primaryButton.click();
 
   pluginInfo = yield promiseForPluginInfo("test");
   ok(pluginInfo.activated, "Test 20c, plugin should be activated");
 
   result = ContentTask.spawn(gTestBrowser, {}, function* () {
     let doc = content.document;
--- a/browser/base/content/test/plugins/browser_plugins_added_dynamically.js
+++ b/browser/base/content/test/plugins/browser_plugins_added_dynamically.js
@@ -109,17 +109,17 @@ add_task(function* () {
 
   yield promiseForNotificationShown(notification);
 
   is(notification.options.pluginData.size, 1, "Should be one plugin action");
 
   let pluginInfo = yield promiseForPluginInfo("pluginone");
   ok(!pluginInfo.activated, "Test 8, test plugin should be activated");
 
-  let condition = function() !notification.dismissed &&
+  let condition = () => !notification.dismissed &&
     PopupNotifications.panel.firstChild;
   yield promiseForCondition(condition);
 
   // "click" the button to activate the Test plugin
   PopupNotifications.panel.firstChild._primaryButton.click();
 
   pluginInfo = yield promiseForPluginInfo("pluginone");
   ok(pluginInfo.activated, "Test 9, test plugin should be activated");
--- a/browser/base/content/test/plugins/browser_private_clicktoplay.js
+++ b/browser/base/content/test/plugins/browser_private_clicktoplay.js
@@ -114,17 +114,17 @@ function test2a() {
 
   // Simulate clicking the "Allow Now" button.
   let promiseShown = BrowserTestUtils.waitForEvent(PopupNotifications.panel,
                                                    "Shown");
   popupNotification.reshow();
   promiseShown.then(() => {
     PopupNotifications.panel.firstChild._secondaryButton.click();
 
-    let condition = function() objLoadingContent.activated;
+    let condition = () => objLoadingContent.activated;
     waitForCondition(condition, test2b, "Test 2a, Waited too long for plugin to activate");
   });
 }
 
 function test2b() {
   createPrivateWindow(test2c, gHttpTestRoot + "plugin_test.html");
 }
 
@@ -164,17 +164,17 @@ function test3a() {
 
   // Simulate clicking the "Allow Always" button.
   let promiseShown = BrowserTestUtils.waitForEvent(PopupNotifications.panel,
                                                    "Shown");
   popupNotification.reshow();
   promiseShown.then(() => {
     PopupNotifications.panel.firstChild._secondaryButton.click();
 
-    let condition = function() objLoadingContent.activated;
+    let condition = () => objLoadingContent.activated;
     waitForCondition(condition, test3b, "Test 3a, Waited too long for plugin to activate");
   });
 }
 
 function test3b() {
   createPrivateWindow(test3c, gHttpTestRoot + "plugin_test.html");
 }
 
--- a/browser/base/content/test/social/browser_social_chatwindow.js
+++ b/browser/base/content/test/social/browser_social_chatwindow.js
@@ -248,22 +248,22 @@ var tests = {
   },
 
   testMultipleProviderChat: function(next) {
     // test incomming chats from all providers
     let port0 = openChat(Social.providers[0], function() {
       let port1 = openChat(Social.providers[1], function() {
         let port2 = openChat(Social.providers[2], function() {
           let chats = document.getElementById("pinnedchats");
-          waitForCondition(function() chats.children.length == Social.providers.length,
+          waitForCondition(() => chats.children.length == Social.providers.length,
             function() {
               ok(true, "one chat window per provider opened");
               // test logout of a single provider
               port2.postMessage({topic: "test-logout"});
-              waitForCondition(function() chats.children.length == Social.providers.length - 1,
+              waitForCondition(() => chats.children.length == Social.providers.length - 1,
                 function() {
                   Task.spawn(closeAllChats).then(next);
                 },
                 "chat window didn't close");
             }, "chat windows did not open");
         });
       });
     });
@@ -283,17 +283,17 @@ var tests = {
         case "test-init-done":
           info("open first chat window");
           port.postMessage({topic: "test-worker-chat", data: chatUrl});
           break;
         case "got-chatbox-message":
           ok(true, "got a chat window opened");
           if (opened) {
             port.postMessage({topic: "test-logout"});
-            waitForCondition(function() document.getElementById("pinnedchats").firstChild == null,
+            waitForCondition(() => document.getElementById("pinnedchats").firstChild == null,
                              function() {
                               next();
                              },
                              "chat windows didn't close");
           } else {
             // open a second chat window
             opened = true;
             port.postMessage({topic: "test-worker-chat", data: chatUrl+"?id=1"});
--- a/browser/base/content/test/social/browser_social_chatwindowfocus.js
+++ b/browser/base/content/test/social/browser_social_chatwindowfocus.js
@@ -30,17 +30,17 @@ function openChatViaSidebarMessage(port,
 }
 
 function openChatViaWorkerMessage(port, data, callback) {
   // sadly there is no message coming back to tell us when the chat has
   // been opened, so we wait until one appears.
   let chatbar = getChatBar();
   let numExpected = chatbar.childElementCount + 1;
   port.postMessage({topic: "test-worker-chat", data: data});
-  waitForCondition(function() chatbar.childElementCount == numExpected,
+  waitForCondition(() => chatbar.childElementCount == numExpected,
                    function() {
                       // so the child has been added, but we don't know if it
                       // has been intialized - re-request it and the callback
                       // means it's done.  Minimized, same as the worker.
                       chatbar.openChat(SocialSidebar.provider.origin,
                                        SocialSidebar.provider.name,
                                        data,
                                        "minimized",
@@ -102,17 +102,17 @@ function test() {
   tab.linkedBrowser.addEventListener("load", function tabLoad(event) {
     tab.linkedBrowser.removeEventListener("load", tabLoad, true);
     // before every test we focus the input field.
     let preSubTest = function(cb) {
       // XXX - when bug 604289 is fixed it should be possible to just do:
       // tab.linkedBrowser.contentWindow.focus()
       // but instead we must do:
       tab.linkedBrowser.contentDocument.getElementById("theinput").focus();
-      waitForCondition(function() isTabFocused(), cb, "tab should have focus");
+      waitForCondition(() => isTabFocused(), cb, "tab should have focus");
     }
     let postSubTest = function(cb) {
       Task.spawn(closeAllChats).then(cb);
     }
     // and run the tests.
     runSocialTestWithProvider(manifest, function (finishcb) {
       SocialSidebar.show();
       runSocialTests(tests, preSubTest, postSubTest, function () {
@@ -139,17 +139,17 @@ var tests = {
         is(chatbar.childElementCount, 1, "exactly 1 chat open");
         ok(isTabFocused(), "tab should still be focused");
         // re-request the same chat via a message.
         openChatViaSidebarMessage(port, {stealFocus: 1}, function() {
           is(chatbar.childElementCount, 1, "still exactly 1 chat open");
           ok(isTabFocused(), "tab should still be focused");
           // re-request the same chat via user event.
           openChatViaUser();
-          waitForCondition(function() isChatFocused(chatbar.selectedChat),
+          waitForCondition(() => isChatFocused(chatbar.selectedChat),
                            function() {
             is(chatbar.childElementCount, 1, "still exactly 1 chat open");
             is(chatbar.selectedChat, chatbar.firstElementChild, "chat should be selected");
             next();
           }, "chat should be focused");
         });
       });
     });
@@ -157,16 +157,16 @@ var tests = {
 
   // In this test we arrange for the sidebar to open the chat via a simulated
   // click.  This should cause the new chat to be opened and focused.
   testFocusWhenViaUser: function(next) {
     startTestAndWaitForSidebar(function(port) {
       let chatbar = getChatBar();
       openChatViaUser();
       ok(chatbar.firstElementChild, "chat opened");
-      waitForCondition(function() isChatFocused(chatbar.selectedChat),
+      waitForCondition(() => isChatFocused(chatbar.selectedChat),
                        function() {
         is(chatbar.selectedChat, chatbar.firstElementChild, "chat is selected");
         next();
       }, "chat should be focused");
     });
   },
 };
--- a/browser/base/content/test/social/browser_social_errorPage.js
+++ b/browser/base/content/test/social/browser_social_errorPage.js
@@ -129,17 +129,17 @@ var tests = {
       openChat(
         manifest.sidebarURL, /* empty html page */
         function() { // the panel api callback
           panelCallbackCount++;
         },
         function() { // the "load" callback.
           todo_is(panelCallbackCount, 0, "Bug 833207 - should be no callback when error page loads.");
           let chat = getChatBar().selectedChat;
-          waitForCondition(function() chat.content != null && chat.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly")==0,
+          waitForCondition(() => chat.content != null && chat.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly")==0,
                            function() {
                             chat.close();
                             next();
                             },
                            "error page didn't appear");
         }
       );
     });
@@ -157,24 +157,24 @@ var tests = {
       null,
       function() { // the "load" callback.
         let chat = getChatBar().selectedChat;
         is(chat.contentDocument.documentURI, url, "correct url loaded");
         // toggle to a detached window.
         chat.swapWindows().then(
           chat => {
             ok(!!chat.content, "we have chat content 1");
-            waitForCondition(function() chat.content != null && chat.contentDocument.readyState == "complete",
+            waitForCondition(() => chat.content != null && chat.contentDocument.readyState == "complete",
                              function() {
               // now go offline and reload the chat - about:socialerror should be loaded.
               goOffline().then(function() {
                 ok(!!chat.content, "we have chat content 2");
                 chat.contentDocument.location.reload();
                 info("chat reload called");
-                waitForCondition(function() chat.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly")==0,
+                waitForCondition(() => chat.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly")==0,
                                  function() {
                                   chat.close();
                                   next();
                                   },
                                  "error page didn't appear");
               });
             }, "swapped window loaded");
           }
--- a/browser/base/content/test/social/browser_social_marks.js
+++ b/browser/base/content/test/social/browser_social_marks.js
@@ -152,34 +152,34 @@ var tests = {
           case "test-init-done":
             ok(true, "test-init-done received");
             ok(provider.profile.userName, "profile was set by test worker");
             // first click marks the page, second click opens the page. We have to
             // synthesize so the command event happens
             EventUtils.synthesizeMouseAtCenter(btn, {});
             // wait for the button to be marked, click to open panel
             is(btn.panel.state, "closed", "panel should not be visible yet");
-            waitForCondition(function() btn.isMarked, function() {
+            waitForCondition(() => btn.isMarked, function() {
               EventUtils.synthesizeMouseAtCenter(btn, {});
             }, "button is marked");
             break;
           case "got-social-panel-visibility":
             ok(true, "got the panel message " + e.data.result);
             if (e.data.result == "shown") {
               // unmark the page via the button in the page
               ensureFrameLoaded(btn.content).then(() => {
                 let doc = btn.contentDocument;
                 let unmarkBtn = doc.getElementById("unmark");
                 ok(unmarkBtn, "testMarkPanel - got the panel unmark button");
                 EventUtils.sendMouseEvent({type: "click"}, unmarkBtn, btn.contentWindow);
               });
             } else {
               // page should no longer be marked
               port.close();
-              waitForCondition(function() !btn.isMarked, function() {
+              waitForCondition(() => !btn.isMarked, function() {
                 // cleanup after the page has been unmarked
                 ensureBrowserTabClosed(tab).then(() => {
                   ok(btn.disabled, "button is disabled");
                   next();
                 });
               }, "button unmarked");
             }
             break;
@@ -240,17 +240,17 @@ var tests = {
       ok(!btn.disabled, "button is enabled");
       port.onmessage = function (e) {
         let topic = e.data.topic;
         switch (topic) {
           case "test-init-done":
             ok(true, "test-init-done received");
             ok(provider.profile.userName, "profile was set by test worker");
             port.postMessage({topic: "test-logout"});
-            waitForCondition(function() !provider.profile.userName,
+            waitForCondition(() => !provider.profile.userName,
                 function() {
                   // when the provider has not indicated to us that a user is
                   // logged in, the first click opens the page.
                   EventUtils.synthesizeMouseAtCenter(btn, {});
                 },
                 "profile was unset by test worker");
             break;
           case "got-social-panel-visibility":
@@ -263,17 +263,17 @@ var tests = {
                 let doc = btn.contentDocument;
                 let unmarkBtn = doc.getElementById("unmark");
                 ok(unmarkBtn, "testMarkPanelLoggedOut - got the panel unmark button");
                 EventUtils.sendMouseEvent({type: "click"}, unmarkBtn, btn.contentWindow);
               });
             } else {
               // page should no longer be marked
               port.close();
-              waitForCondition(function() !btn.isMarked, function() {
+              waitForCondition(() => !btn.isMarked, function() {
                 // cleanup after the page has been unmarked
                 ensureBrowserTabClosed(tab).then(() => {
                   ok(btn.disabled, "button is disabled");
                   next();
                 });
               }, "button unmarked");
             }
             break;
--- a/browser/base/content/test/social/browser_social_multiworker.js
+++ b/browser/base/content/test/social/browser_social_multiworker.js
@@ -47,17 +47,17 @@ var tests = {
       };
       port.postMessage({topic: "test-init"});
     }
 
     for (let p of Social.providers) {
       oneWorkerTest(p);
     }
 
-    waitForCondition(function() messageReceived == Social.providers.length,
+    waitForCondition(() => messageReceived == Social.providers.length,
                      next, "received messages from all workers",
                      /* increase timeout because shutting down a child process is slow */ 60);
   },
 
    testMultipleWorkerEnabling: function(next) {
      // test that all workers are enabled when we allow multiple workers
      for (let p of Social.providers) {
        ok(p.enabled, "provider enabled");
--- a/browser/base/content/test/social/browser_social_window.js
+++ b/browser/base/content/test/social/browser_social_window.js
@@ -91,17 +91,17 @@ var tests = {
 
   // Check when providers are enabled and social is turned on at startup.
   testEnabledStartup: function(cbnext) {
     setManifestPref("social.manifest.test", manifest);
     ok(!SocialSidebar.opened, "sidebar is closed initially");
     SocialService.addProvider(manifest, function() {
       SocialService.addProvider(manifest2, function (provider) {
         SocialSidebar.show();
-        waitForCondition(function() SocialSidebar.opened,
+        waitForCondition(() => SocialSidebar.opened,
                      function() {
           ok(SocialSidebar.opened, "first window sidebar is open");
           openWindowAndWaitForInit(window, function(w1) {
             ok(w1.SocialSidebar.opened, "new window sidebar is open");
             ok(SocialService.hasEnabledProviders, "providers are enabled");
             checkSocialUI(w1);
             // now init is complete, open a second window
             openWindowAndWaitForInit(window, function(w2) {
@@ -135,17 +135,17 @@ var tests = {
     ok(!SocialSidebar.opened, "sidebar is closed initially");
     ok(!Services.prefs.prefHasUserValue("social.sidebar.provider"), "global state unset");
     // mimick no session state in opener so we exercise the global state via pref
     SessionStore.deleteWindowValue(window, "socialSidebar");
     ok(!SessionStore.getWindowValue(window, "socialSidebar"), "window state unset");
     SocialService.addProvider(manifest, function() {
       openWindowAndWaitForInit(window, function(w1) {
         w1.SocialSidebar.show();
-        waitForCondition(function() w1.SocialSidebar.opened,
+        waitForCondition(() => w1.SocialSidebar.opened,
                      function() {
           ok(Services.prefs.prefHasUserValue("social.sidebar.provider"), "global state set");
           ok(!SocialSidebar.opened, "1. main sidebar is still closed");
           ok(w1.SocialSidebar.opened, "1. window sidebar is open");
           closeWindow(w1, function() {
             // this time, the global state should cause the sidebar to be opened
             // in the new window
             openWindowAndWaitForInit(window, function(w1) {
--- a/browser/base/content/test/social/head.js
+++ b/browser/base/content/test/social/head.js
@@ -149,17 +149,17 @@ function runSocialTestWithProvider(manif
       }
 
       // If we've added all the providers we need, call the callback to start
       // the tests (and give it a callback it can call to finish them)
       if (providersAdded == manifests.length) {
         registerCleanupFunction(function () {
           finishSocialTest(true);
         });
-        waitForCondition(function() provider.enabled,
+        waitForCondition(() => provider.enabled,
                          function() {
           info("provider has been enabled");
           callback(finishSocialTest);
         }, "providers added and enabled");
       }
     });
   });
 }
@@ -584,17 +584,17 @@ function resizeAndCheckWidths(first, sec
   let count = checks.length;
   let [width, numExpectedVisible, why] = checks.shift();
   info("<< Check " + count + ": " + why);
   info(count + ": " + "resizing window to " + width + ", expect " + numExpectedVisible + " visible items");
   resizeWindowToChatAreaWidth(width, function(sizedOk) {
     checkPopup();
     ok(sizedOk, count+": window resized correctly");
     function collapsedObserver(r, m) {
-      if ([first, second, third].filter(function(item) !item.collapsed).length == numExpectedVisible) {
+      if ([first, second, third].filter(item => !item.collapsed).length == numExpectedVisible) {
         if (m) {
           m.disconnect();
         }
         ok(true, count + ": " + "correct number of chats visible");
         info(">> Check " + count);
         executeSoon(function() {
           resizeAndCheckWidths(first, second, third, checks, cb);
         });
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -598,17 +598,17 @@ file, You can obtain one at http://mozil
           } catch (ex) {}
 
           // If the entire URL is selected, just use the actual loaded URI.
           if (inputVal == selectedVal) {
             // ... but only if  isn't a javascript: or data: URI, since those
             // are hard to read when encoded
             if (!uri.schemeIs("javascript") && !uri.schemeIs("data")) {
               // Parentheses are known to confuse third-party applications (bug 458565).
-              selectedVal = uri.spec.replace(/[()]/g, function (c) escape(c));
+              selectedVal = uri.spec.replace(/[()]/g, c => escape(c));
             }
 
             return selectedVal;
           }
 
           // Just the beginning of the URL is selected, check for a trimmed
           // value
           let spec = uri.spec;
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -209,17 +209,17 @@ const CustomizableWidgets = [
               let item = doc.createElementNS(kNSXUL, "toolbarbutton");
               item.setAttribute("label", title || uri);
               item.setAttribute("targetURI", uri);
               item.setAttribute("class", "subviewbutton");
               item.addEventListener("click", function (aEvent) {
                 onHistoryVisit(uri, aEvent, item);
               });
               if (icon) {
-                let iconURL = PlacesUtils.getImageURLForResolution(win, "moz-anno:favicon:" + icon);
+                let iconURL = "moz-anno:favicon:" + icon;
                 item.setAttribute("image", iconURL);
               }
               fragment.appendChild(item);
             } catch (e) {
               ERROR("Error while showing history subview: " + e);
             }
           }
           items.appendChild(fragment);
--- a/browser/components/loop/content/css/panel.css
+++ b/browser/components/loop/content/css/panel.css
@@ -886,46 +886,16 @@ html[dir="rtl"] .user-details .dropdown-
 html[dir="rtl"] .settings-menu .dropdown-menu {
   /* This is specified separately rather than using -moz-margin-start etc, as
      we need to override .dropdown-menu's values which can't use the gecko
      specific extensions. */
   left: 14px;
   right: auto;
 }
 
-.settings-menu .icon {
-  background-size: contain;
-  background-repeat: no-repeat;
-  background-position: center;
-  width: 12px;
-  height: 12px;
-  -moz-margin-end: 1em;
-  margin-top: 2px;
-}
-
-.settings-menu .icon-tour {
-  background-image: url("../shared/img/icons-16x16.svg#tour");
-}
-
-.settings-menu .icon-account {
-  background-image: url(../shared/img/svg/glyph-account-16x16.svg);
-}
-
-.settings-menu .icon-signin {
-  background-image: url(../shared/img/svg/glyph-signin-16x16.svg);
-}
-
-.settings-menu .icon-signout {
-  background-image: url(../shared/img/svg/glyph-signout-16x16.svg);
-}
-
-.settings-menu .icon-help {
-  background-image: url(../shared/img/svg/glyph-help-16x16.svg);
-}
-
 /* Footer */
 
 .footer {
   display: flex;
   flex-direction: row;
   flex-wrap: nowrap;
   justify-content: space-between;
   align-content: stretch;
--- a/browser/components/loop/content/shared/img/icons-16x16.svg
+++ b/browser/components/loop/content/shared/img/icons-16x16.svg
@@ -66,17 +66,16 @@
       <rect x="7.75" y="7.542" fill="#fff" width="0.5" height="4"/>
       <polyline fill="#fff" points="9.25,7.542 8.75,7.542 8.75,11.542 9.25,11.542  "/>
       <rect x="6.75" y="7.542" fill="#fff" width="0.5" height="4"/>
     </g>
     <g id="leave-shape">
       <polygon fill="#fff" points="2.08,11.52 2.08,4 8,4 8,2.24 0.32,2.24 0.32,13.28 8,13.28 8,11.52"/>
       <polygon fill="#fff" points="15.66816,7.77344 9.6,2.27456 9.6,5.6 3.68,5.6 3.68,9.92 9.6,9.92 9.6,13.27232"/>
     </g>
-    <path id="tour-shape" fill="#5a5a5a" d="M8,0C4.831,0,2.262,2.674,2.262,5.972c0,1.393,1.023,3.398,2.206,5.249l0.571, 0.866C6.504,14.245,8,16,8,16 s1.496-1.755,2.961-3.912l0.571-0.866c1.182-1.852,2.206-3.856,2.206-5.249C13.738,2.674, 11.169,0,8,0z M8,7.645 c-0.603,0-1.146-0.262-1.534-0.681C6.098,6.566,5.87,6.025,5.87,5.428c0-1.224,0.954-2.217, 2.13-2.217s2.13,0.992,2.13,2.217 C10.13,6.653,9.177,7.645,8,7.645z"/>
     <g id="delete-shape">
       <path fill="#ccc" d="M14.191,4.579c0-1.149-0.832-2.08-1.857-2.08h-0.902V1.997C11.432,0.894,10.633,0,9.648,0H6.352 C5.367,0,4.568,0.894,4.568,1.997v0.502H3.666c-1.026,0-1.857,0.932-1.857,2.08v1.389h1.064l0.785,8.416 C3.742,15.29,4.499,16,5.383,16h5.231c0.883,0,1.64-0.709,1.724-1.614l0.788-8.417h1.064V4.579z M5.535,2.218V2.065 c0-0.58,0.42-1.05,0.938-1.05h3.055c0.518,0,0.937,0.47,0.937,1.05v0.153c0,0.098-0.016,0.191-0.038,0.281H5.573 C5.55,2.409,5.535,2.316,5.535,2.218z M11.184,14.277c-0.029,0.305-0.29,0.562-0.57,0.562H5.383c-0.281,0-0.541-0.257-0.57-0.562 L4.038,5.969h7.924L11.184,14.277z"/>
       <rect x="7.612" y="7.291" fill="#ccc" width="0.774" height="6.191"/>
       <polyline fill="#ccc" points="9.934,7.291 9.16,7.291 9.16,13.482 9.934,13.482  "/>
       <rect x="6.065" y="7.291" fill="#ccc" width="0.774" height="6.191"/>
     </g>
     <g id="globe-shape" transform="translate(-40.000000, -40.000000)" fill-rule="evenodd">
       <path d="M48,56 C52.418278,56 56,52.418278 56,48 C56,43.581722 52.418278,40 48,40 C43.581722,40 40,43.581722 40,48 C40,52.418278 43.581722,56 48,56 Z M42.630492,47.0453156 C42.5321586,46.9747601 42.3116031,46.9575379 42.3388253,46.7925379 C42.3560475,46.6919823 42.4593808,46.613649 42.5438253,46.5642045 C42.6538253,46.5003156 42.7766031,46.4980934 42.9010475,46.5092045 C42.9310475,46.5119823 42.9866031,46.5069823 43.0021586,46.5297601 C43.010492,46.5425379 43.0277142,46.5492045 43.0416031,46.553649 C43.0743808,46.563649 43.1088253,46.5642045 43.1427142,46.5703156 C43.1932697,46.5803156 43.2288253,46.6247601 43.280492,46.588649 C43.3388253,46.5469823 43.3482697,46.5392045 43.4188253,46.5475379 C43.4827142,46.5553156 43.520492,46.5064268 43.5743808,46.5108712 C43.5910475,46.5125379 43.605492,46.5158712 43.6182697,46.5208712 C43.6238253,46.5030934 43.6316031,46.4869823 43.6427142,46.483649 C43.6693808,46.4753156 43.7282697,46.5403156 43.755492,46.5458712 C43.825492,46.5597601 43.8210475,46.5114268 43.8266031,46.4608712 C43.8616031,46.4542045 43.8782697,46.5030934 43.910492,46.4725379 C43.9093808,46.4825379 43.915492,46.4964268 43.9149364,46.5069823 C43.9221586,46.5114268 43.9288253,46.5114268 43.9360475,46.5064268 C43.9388253,46.5003156 43.9393808,46.4947601 43.9377142,46.488649 C43.9543808,46.4942045 43.9632697,46.4819823 43.965492,46.4614268 C43.9777142,46.4630934 43.9982697,46.4553156 44.0110475,46.4575379 C44.0199364,46.4208712 44.0416031,46.3730934 44.0149364,46.3397601 C44.0221586,46.3380934 44.0288253,46.3369823 44.0360475,46.3347601 C44.0366031,46.2997601 44.060492,46.2830934 44.0616031,46.253649 C44.0232697,46.248649 43.9816031,46.2508712 43.9421586,46.2519823 C43.965492,46.2303156 44.0216031,46.1830934 44.0271586,46.1542045 C44.0371586,46.103649 43.9699364,46.0719823 43.975492,46.0114268 C43.9816031,46.043649 44.0182697,46.1169823 44.0521586,46.1280934 C44.1282697,46.153649 44.1066031,46.0775379 44.1121586,46.0380934 C44.130492,45.9130934 44.2432697,46.0164268 44.2449364,46.0819823 C44.2782697,46.0064268 44.3599364,46.0897601 44.3232697,46.1542045 C44.3049364,46.1858712 44.2799364,46.173649 44.3021586,46.2147601 C44.3182697,46.243649 44.3416031,46.2447601 44.3749364,46.2369823 C44.3843808,46.2197601 44.3921586,46.2003156 44.3916031,46.1803156 C44.4499364,46.1619823 44.4877142,46.2314268 44.4538253,46.273649 C44.4971586,46.2497601 44.5421586,46.2269823 44.5888253,46.2153156 C44.560492,46.1197601 44.5327142,46.0253156 44.5510475,45.9219823 C44.5549364,45.8997601 44.5582697,45.873649 44.5749364,45.8564268 C44.5966031,45.8342045 44.5693808,45.8430934 44.5671586,45.8280934 C44.5616031,45.7825379 44.6093808,45.7369823 44.6271586,45.6969823 C44.5766031,45.6853156 44.6232697,45.5869823 44.6560475,45.5703156 C44.6916031,45.5519823 44.7982697,45.5814268 44.8049364,45.5530934 C44.8260475,45.5653156 44.8460475,45.5819823 44.8721586,45.5825379 C44.9299364,45.5830934 44.9693808,45.5842045 45.0093808,45.6314268 C45.030492,45.6553156 45.0593808,45.7103156 45.0960475,45.7142045 C45.0949364,45.7547601 45.1416031,45.7853156 45.0927142,45.8197601 C45.0543808,45.8464268 45.0010475,45.8397601 44.9849364,45.8914268 C44.9749364,45.923649 44.9443808,45.9380934 44.990492,45.9608712 C45.0116031,45.9708712 45.0360475,45.973649 45.0588253,45.9730934 C45.0638253,46.0053156 45.0793808,46.0458712 45.1199364,46.0408712 C45.1988253,46.0314268 45.2149364,45.9330934 45.2782697,45.8997601 C45.3793808,45.8464268 45.3632697,46.0780934 45.4521586,46.0192045 C45.4732697,46.0058712 45.4732697,45.9469823 45.4832697,45.9247601 C45.5043808,45.8769823 45.5299364,45.8297601 45.560492,45.7869823 C45.5988253,45.7342045 45.6477142,45.678649 45.6310475,45.608649 C45.6221586,45.5703156 45.5477142,45.5542045 45.5138253,45.5269823 C45.4727142,45.4942045 45.4343808,45.458649 45.4093808,45.4125379 C45.3949364,45.3853156 45.3860475,45.3747601 45.4099364,45.3619823 C45.4238253,45.3542045 45.4188253,45.338649 45.4138253,45.3280934 C45.3888253,45.2742045 45.3193808,45.1792045 45.4160475,45.1464268 C45.4371586,45.1392045 45.4821586,45.0703156 45.4849364,45.0430934 C45.4899364,44.9980934 45.4221586,44.9580934 45.4527142,44.9130934 C45.475492,44.8792045 45.5310475,44.858649 45.560492,44.8247601 C45.5738253,44.8092045 45.5899364,44.7953156 45.6110475,44.7908712 C45.6127142,44.7725379 45.6166031,44.7525379 45.6321586,44.7403156 C45.6582697,44.7214268 45.6982697,44.7303156 45.7277142,44.7214268 C45.7760475,44.7064268 45.7977142,44.6558712 45.8360475,44.6275379 C45.8671586,44.6042045 45.9038253,44.6125379 45.9371586,44.5964268 C45.955492,44.5875379 45.9632697,44.5680934 45.9810475,44.5597601 C46.025492,44.5380934 46.0760475,44.5725379 46.0960475,44.6103156 C46.1443808,44.7003156 46.2038253,44.838649 46.3399364,44.8025379 C46.3943808,44.7875379 46.435492,44.7425379 46.4527142,44.6908712 C46.4693808,44.6419823 46.4499364,44.6014268 46.4527142,44.5525379 C46.4571586,44.4680934 46.5416031,44.413649 46.5499364,44.328649 C46.4866031,44.3297601 46.5193808,44.2897601 46.4988253,44.2542045 C46.475492,44.2130934 46.4221586,44.2430934 46.3866031,44.2364268 C46.4227142,44.1503156 46.4227142,44.1192045 46.3377142,44.0780934 C46.3010475,44.0597601 46.2393808,43.973649 46.2116031,43.9769823 C46.2349364,43.9447601 46.2899364,43.998649 46.3066031,44.0142045 C46.3432697,44.0492045 46.3760475,44.0653156 46.4282697,44.0692045 C46.4138253,44.0464268 46.4060475,44.0058712 46.4160475,43.9803156 C46.425492,43.9564268 46.4016031,43.9319823 46.4038253,43.9019823 C46.4632697,43.9780934 46.4532697,44.0653156 46.4877142,44.148649 C46.5021586,44.1842045 46.5360475,44.2075379 46.5510475,44.243649 C46.570492,44.2892045 46.5582697,44.2892045 46.5988253,44.3169823 C46.6227142,44.3330934 46.6310475,44.363649 46.635492,44.3903156 C46.6427142,44.4375379 46.6599364,44.4169823 46.6849364,44.443649 C46.6999364,44.4597601 46.7382697,44.4625379 46.730492,44.4953156 C46.725492,44.518649 46.7099364,44.538649 46.7066031,44.5619823 C46.6966031,44.633649 46.8360475,44.5375379 46.8493808,44.5275379 C46.8788253,44.5053156 46.9277142,44.5003156 46.9516031,44.473649 C46.975492,44.4458712 46.9699364,44.4058712 46.9960475,44.3792045 C47.0277142,44.3469823 47.0582697,44.3692045 47.0971586,44.3625379 C47.1410475,44.3558712 47.1793808,44.3208712 47.2121586,44.293649 C47.2821586,44.2353156 47.3260475,44.1708712 47.3849364,44.103649 C47.3599364,44.1097601 47.2721586,44.1730934 47.2677142,44.1147601 C47.2338253,44.113649 47.1582697,44.108649 47.1460475,44.0719823 C47.1371586,44.0453156 47.140492,44.0164268 47.1399364,43.988649 C47.1393808,43.9603156 47.1043808,43.9697601 47.0810475,43.9547601 C47.0343808,43.9242045 47.0110475,43.8697601 46.9610475,43.8430934 C46.8816031,43.8014268 46.8332697,43.7347601 46.7860475,43.6630934 C46.7582697,43.6208712 46.6610475,43.5358712 46.6677142,43.4853156 C46.6727142,43.4525379 46.6999364,43.4169823 46.6982697,43.383649 C46.6966031,43.3547601 46.6732697,43.338649 46.6760475,43.3053156 C46.6799364,43.2664268 46.5860475,43.1992045 46.6677142,43.1914268 C46.6943808,43.1892045 46.6977142,43.158649 46.7260475,43.1414268 C46.7582697,43.1219823 46.7510475,43.1053156 46.7860475,43.1147601 C46.8421586,43.1308712 46.8816031,43.0697601 46.9199364,43.0364268 C46.985492,42.978649 46.880492,42.9769823 46.8749364,42.9342045 C46.8693808,42.8897601 46.8438253,42.8575379 46.8371586,42.8064268 C46.8327142,42.7692045 46.7977142,42.783649 46.7777142,42.7930934 C46.7499364,42.8058712 46.7227142,42.7869823 46.6960475,42.7814268 C46.6710475,42.7764268 46.6510475,42.7358712 46.6221586,42.748649 C46.5999364,42.758649 46.600492,42.7864268 46.5688253,42.7830934 C46.5449364,42.7803156 46.530492,42.7575379 46.5066031,42.7542045 C46.4710475,42.7492045 46.5027142,42.7830934 46.4627142,42.7869823 C46.4338253,42.788649 46.3421586,42.7497601 46.3399364,42.7869823 C46.310492,42.7375379 46.2993808,42.8208712 46.2682697,42.8297601 C46.2349364,42.8397601 46.1982697,42.8303156 46.1649364,42.843649 C46.0910475,42.873649 46.1143808,42.9475379 46.1860475,42.958649 C46.2432697,42.9680934 46.1688253,43.0069823 46.1877142,43.0458712 C46.2043808,43.0803156 46.2099364,43.103649 46.2471586,43.1175379 C46.3093808,43.1403156 46.3749364,43.158649 46.3532697,43.2380934 C46.325492,43.3364268 46.2566031,43.4292045 46.1599364,43.4742045 C46.0677142,43.5169823 46.0427142,43.3997601 45.9727142,43.3703156 C45.9293808,43.3525379 45.8799364,43.358649 45.8349364,43.3642045 C45.8266031,43.3758712 45.8988253,43.3975379 45.9099364,43.418649 C45.9316031,43.4603156 45.8732697,43.4553156 45.8688253,43.4864268 C45.8643808,43.513649 45.8293808,43.5330934 45.8482697,43.5603156 C45.8282697,43.5347601 45.7888253,43.568649 45.775492,43.5830934 C45.755492,43.6053156 45.7593808,43.618649 45.7677142,43.6453156 C45.7849364,43.7003156 45.7027142,43.7569823 45.6532697,43.7497601 C45.6121586,43.7442045 45.5727142,43.7469823 45.5338253,43.7280934 C45.4866031,43.7053156 45.5032697,43.7192045 45.4932697,43.6664268 C45.4838253,43.6175379 45.4160475,43.5964268 45.4560475,43.5353156 C45.4843808,43.4897601 45.4710475,43.4947601 45.465492,43.4514268 C45.4593808,43.4064268 45.4799364,43.4008712 45.515492,43.393649 C45.5543808,43.3858712 45.5716031,43.3175379 45.595492,43.283649 C45.6010475,43.2758712 45.6243808,43.2142045 45.5871586,43.2303156 C45.5649364,43.2392045 45.5816031,43.2658712 45.5488253,43.2714268 C45.5243808,43.2747601 45.5016031,43.2592045 45.4777142,43.2592045 C45.4499364,43.2592045 45.420492,43.2730934 45.395492,43.2553156 C45.4077142,43.2403156 45.4999364,43.1664268 45.4271586,43.1503156 C45.3982697,43.1442045 45.4227142,43.1914268 45.3843808,43.1853156 C45.3760475,43.2230934 45.3310475,43.218649 45.3088253,43.2430934 C45.3177142,43.2030934 45.4027142,43.173649 45.3749364,43.1414268 C45.4349364,43.0880934 45.4471586,43.0792045 45.365492,43.0503156 C45.2371586,43.0053156 45.2471586,42.8742045 45.335492,42.7942045 C45.4160475,42.7214268 45.5488253,42.6292045 45.6266031,42.7503156 C45.710492,42.8797601 45.7638253,42.7858712 45.8327142,42.7025379 C45.8093808,42.6925379 45.830492,42.6864268 45.8227142,42.6580934 C45.7466031,42.688649 45.6788253,42.5903156 45.7310475,42.5308712 C45.7621586,42.4958712 45.8116031,42.5058712 45.8532697,42.4953156 C45.8916031,42.4853156 45.9249364,42.4480934 45.940492,42.4147601 C45.9088253,42.4230934 45.9127142,42.403649 45.9249364,42.3892045 C45.905492,42.3875379 45.8849364,42.3792045 45.8688253,42.373649 C45.8232697,42.3580934 45.8260475,42.3225379 45.7782697,42.3158712 C45.6621586,42.298649 45.8982697,42.1664268 45.7827142,42.1658712 C45.7460475,42.1653156 45.7121586,42.108649 45.6849364,42.1197601 C45.665492,42.1275379 45.6616031,42.1425379 45.6377142,42.1325379 C45.6216031,42.1258712 45.6021586,42.1119823 45.5838253,42.1230934 C45.5416031,42.1492045 45.5338253,42.1175379 45.4932697,42.1303156 C45.4610475,42.1403156 45.4421586,42.1719823 45.4043808,42.163649 C45.4421586,42.1125379 45.4888253,42.0703156 45.5227142,42.0158712 C45.545492,41.9797601 45.5721586,41.9469823 45.6099364,41.9247601 C45.6299364,41.9119823 45.6871586,41.9008712 45.690492,41.8725379 C45.695492,41.8269823 45.6666031,41.8303156 45.6349364,41.8492045 C45.5527142,41.898649 45.4671586,41.9514268 45.3860475,42.003649 C45.3377142,42.0347601 45.2988253,42.0614268 45.2382697,42.0525379 C45.1921586,42.0453156 45.1732697,42.0969823 45.1360475,42.0919823 C45.1182697,42.0208712 44.7199364,42.2808712 44.6716031,42.3025379 C44.5943808,42.3375379 44.5066031,42.3964268 44.4243808,42.4164268 C44.3899364,42.4247601 44.3193808,42.5047601 44.3232697,42.4164268 C44.2816031,42.4114268 44.2499364,42.453649 44.2210475,42.4758712 C44.1810475,42.5069823 44.1327142,42.5253156 44.0899364,42.5525379 C43.9960475,42.6125379 43.9082697,42.683649 43.8210475,42.7514268 C43.7382697,42.8158712 43.655492,42.8908712 43.5688253,42.948649 C43.5388253,42.968649 43.4293808,43.0247601 43.4332697,43.0664268 C43.5110475,43.0808712 43.7743808,42.7508712 43.8482697,42.8403156 C43.8671586,42.8630934 43.7366031,42.9292045 43.7143808,42.9419823 C43.6966031,42.9519823 43.675492,42.9514268 43.6582697,42.9608712 C43.6338253,42.973649 43.6193808,42.9975379 43.5966031,43.0125379 C43.5382697,43.0503156 43.4882697,43.098649 43.4449364,43.1525379 C43.4132697,43.1919823 43.3910475,43.2425379 43.3577142,43.2792045 C43.3632697,43.2408712 43.355492,43.2130934 43.3566031,43.1758712 C43.3127142,43.2030934 43.2949364,43.2508712 43.2343808,43.2369823 C43.1799364,43.2247601 43.1360475,43.2803156 43.0966031,43.3103156 C43.005492,43.3797601 42.9443808,43.4569823 42.8677142,43.538649 C42.825492,43.5842045 42.7799364,43.6164268 42.7532697,43.673649 C42.7249364,43.7342045 42.6843808,43.7892045 42.6466031,43.8453156 C42.5766031,43.9492045 42.4949364,44.0447601 42.4243808,44.148649 C42.2816031,44.3614268 42.1871586,44.6058712 42.0699364,44.8319823 C42.0082697,44.9497601 41.9499364,45.0664268 41.9260475,45.1969823 C41.9043808,45.3108712 41.9032697,45.4269823 41.9066031,45.5419823 C41.970492,45.4914268 41.9671586,45.5975379 41.9510475,45.6280934 C41.9260475,45.6764268 41.9171586,45.7308712 41.9088253,45.783649 C41.8982697,45.853649 41.8860475,45.923649 41.8860475,45.9942045 C41.8866031,46.053649 41.8671586,46.1097601 41.865492,46.1675379 C41.8427142,46.1508712 41.8916031,46.0780934 41.8488253,46.0880934 C41.8277142,46.0930934 41.8266031,46.1247601 41.8216031,46.1403156 C41.8043808,46.1958712 41.7288253,46.1908712 41.7177142,46.253649 C41.710492,46.2930934 41.7066031,46.3147601 41.680492,46.3464268 C41.6616031,46.3697601 41.6799364,46.3803156 41.6838253,46.403649 C41.6938253,46.4603156 41.6216031,46.5369823 41.6410475,46.5819823 C41.6593808,46.6253156 41.6460475,46.6747601 41.6660475,46.7164268 C41.6766031,46.7380934 41.7010475,46.7658712 41.6910475,46.7925379 C41.6466031,46.8014268 41.7043808,46.9058712 41.7082697,46.9380934 C41.7149364,46.9908712 41.7610475,47.1553156 41.8127142,47.178649 C41.8760475,47.2769823 41.9627142,47.4125379 42.0749364,47.4614268 C42.1549364,47.4958712 42.1838253,47.393649 42.2282697,47.3503156 C42.2849364,47.2947601 42.3571586,47.2597601 42.4321586,47.233649 C42.4949364,47.2114268 42.7560475,47.1353156 42.630492,47.0453156 Z M48.0699364,48.1330934 C48.0499364,48.1330934 48.0143808,48.1469823 47.9982697,48.1608712 C47.9660475,48.1880934 48.0343808,48.2047601 48.0610475,48.2125379 C48.090492,48.2292045 48.1321586,48.2380934 48.1616031,48.2547601 C48.1860475,48.2725379 48.2027142,48.2975379 48.230492,48.3097601 C48.2643808,48.3253156 48.310492,48.3330934 48.3477142,48.3430934 C48.3643808,48.348649 48.3882697,48.3469823 48.4093808,48.3514268 C48.4327142,48.3647601 48.4432697,48.3864268 48.4621586,48.4008712 C48.4949364,48.4314268 48.5416031,48.438649 48.585492,48.4375379 C48.6266031,48.4414268 48.6577142,48.4480934 48.6949364,48.438649 C48.7366031,48.4280934 48.7671586,48.4497601 48.8066031,48.4492045 C48.8216031,48.4503156 48.8377142,48.4364268 48.8527142,48.4375379 C48.8727142,48.4375379 48.8749364,48.4464268 48.8843808,48.4630934 C48.9010475,48.4880934 48.945492,48.5253156 48.975492,48.5275379 C48.9949364,48.5269823 49.0093808,48.523649 49.025492,48.5292045 C49.0427142,48.5392045 49.050492,48.5397601 49.0632697,48.5508712 C49.085492,48.5597601 49.1043808,48.5669823 49.1143808,48.583649 C49.1316031,48.6130934 49.1310475,48.6469823 49.1566031,48.6697601 C49.175492,48.6842045 49.1938253,48.6992045 49.2127142,48.713649 C49.225492,48.7247601 49.2149364,48.7225379 49.2343808,48.7225379 C49.245492,48.7247601 49.2649364,48.7242045 49.2788253,48.7208712 C49.3321586,48.7169823 49.3027142,48.6425379 49.2866031,48.6175379 C49.275492,48.5958712 49.2660475,48.5792045 49.2710475,48.558649 C49.2738253,48.533649 49.2849364,48.5169823 49.2693808,48.4964268 C49.2610475,48.4842045 49.2493808,48.4775379 49.2377142,48.4708712 C49.2310475,48.4630934 49.2282697,48.453649 49.220492,48.4414268 C49.2049364,48.4208712 49.1738253,48.4147601 49.1538253,48.3953156 C49.1193808,48.3603156 49.1021586,48.3119823 49.0588253,48.2792045 C49.035492,48.2658712 49.0132697,48.2764268 48.985492,48.2642045 C48.9738253,48.2575379 48.9671586,48.2497601 48.950492,48.2442045 C48.9343808,48.238649 48.9199364,48.2419823 48.905492,48.2408712 C48.8749364,48.238649 48.8482697,48.2119823 48.8188253,48.2147601 C48.785492,48.2180934 48.7799364,48.2530934 48.7599364,48.2725379 C48.7438253,48.2864268 48.7238253,48.2864268 48.7182697,48.2642045 C48.715492,48.2358712 48.7260475,48.218649 48.7410475,48.2003156 C48.7643808,48.1753156 48.7410475,48.1619823 48.710492,48.1597601 C48.6710475,48.1603156 48.6643808,48.1908712 48.6482697,48.223649 C48.6227142,48.2592045 48.6060475,48.2342045 48.570492,48.228649 C48.5460475,48.2303156 48.5288253,48.2397601 48.5066031,48.2303156 C48.4899364,48.2253156 48.4866031,48.2114268 48.4749364,48.2047601 C48.4577142,48.1947601 48.4432697,48.1980934 48.430492,48.2064268 C48.4121586,48.2108712 48.4121586,48.2108712 48.3943808,48.2008712 C48.3782697,48.1953156 48.3749364,48.1814268 48.3538253,48.1775379 C48.3227142,48.1708712 48.2899364,48.1980934 48.2632697,48.1903156 C48.2516031,48.183649 48.2421586,48.1669823 48.2260475,48.1614268 C48.2082697,48.1514268 48.2110475,48.1603156 48.1993808,48.1730934 C48.1799364,48.1925379 48.1516031,48.1992045 48.1327142,48.1847601 C48.1088253,48.1669823 48.1060475,48.138649 48.0699364,48.1330934 Z M48.8121586,48.8430934 C48.805492,48.8297601 48.8127142,48.8164268 48.8127142,48.803649 C48.8093808,48.7803156 48.8027142,48.773649 48.8066031,48.7508712 C48.8132697,48.7375379 48.8132697,48.7175379 48.8099364,48.7008712 C48.8038253,48.6875379 48.7938253,48.6780934 48.7832697,48.6680934 C48.7838253,48.6614268 48.780492,48.6514268 48.7738253,48.6447601 C48.7599364,48.6314268 48.7466031,48.6508712 48.7327142,48.6575379 C48.7227142,48.6675379 48.7021586,48.673649 48.6982697,48.683649 C48.6882697,48.7003156 48.6949364,48.713649 48.6949364,48.7269823 L48.6977142,48.7430934 C48.6738253,48.7664268 48.6971586,48.8292045 48.6932697,48.8525379 C48.6932697,48.878649 48.655492,48.9542045 48.7066031,48.9314268 C48.7199364,48.9247601 48.730492,48.9153156 48.7438253,48.908649 C48.7610475,48.898649 48.7810475,48.8992045 48.8016031,48.8925379 C48.8082697,48.8925379 48.845492,48.8897601 48.845492,48.8830934 C48.8460475,48.8697601 48.815492,48.8597601 48.8121586,48.8430934 Z M49.2532697,49.4003156 C49.2616031,49.3942045 49.2743808,49.4003156 49.2810475,49.3980934 C49.2982697,49.3953156 49.3066031,49.378649 49.3216031,49.3808712 C49.3388253,49.3780934 49.3299364,49.3947601 49.3410475,49.4053156 C49.3521586,49.4153156 49.3627142,49.4153156 49.3732697,49.4153156 C49.3927142,49.4192045 49.4293808,49.4203156 49.4371586,49.403649 C49.445492,49.3764268 49.400492,49.3708712 49.3899364,49.3497601 C49.3782697,49.3192045 49.4032697,49.2892045 49.4116031,49.2619823 C49.4238253,49.2258712 49.3788253,49.2103156 49.3827142,49.1808712 C49.3816031,49.1492045 49.4032697,49.138649 49.3960475,49.1097601 C49.3916031,49.0869823 49.3716031,49.0619823 49.3588253,49.0453156 C49.345492,49.0292045 49.3216031,49.0125379 49.3232697,48.9875379 C49.3249364,48.9625379 49.3721586,48.963649 49.350492,48.9325379 C49.3371586,48.9058712 49.3027142,48.9108712 49.2727142,48.9069823 C49.2621586,48.9069823 49.2516031,48.9075379 49.240492,48.8969823 C49.2316031,48.8825379 49.235492,48.8742045 49.235492,48.863649 C49.2288253,48.8347601 49.2071586,48.8247601 49.1810475,48.8125379 C49.1721586,48.808649 49.1599364,48.8025379 49.1549364,48.7903156 C49.150492,48.7775379 49.1632697,48.7730934 49.1588253,48.7608712 C49.145492,48.733649 49.0949364,48.7725379 49.0732697,48.7619823 C49.0582697,48.7603156 49.0599364,48.7458712 49.0510475,48.7308712 L49.025492,48.7192045 C48.990492,48.7030934 48.9760475,48.7325379 48.9832697,48.7614268 C48.9993808,48.8258712 49.0471586,48.8692045 49.0416031,48.9342045 C49.0443808,48.9614268 49.0488253,48.973649 49.0577142,48.998649 C49.0671586,49.0342045 49.0766031,49.0514268 49.060492,49.0853156 C49.0349364,49.1042045 49.0577142,49.1280934 49.0671586,49.1530934 C49.0716031,49.1864268 49.080492,49.2114268 49.0788253,49.2469823 C49.0738253,49.3119823 49.0532697,49.3747601 49.0588253,49.4397601 C49.0616031,49.4664268 49.0593808,49.4919823 49.0688253,49.5169823 C49.0738253,49.5497601 49.0993808,49.5619823 49.1277142,49.5803156 C49.1538253,49.6030934 49.2771586,49.6758712 49.2410475,49.5869823 C49.2299364,49.5658712 49.2127142,49.5369823 49.2077142,49.5142045 C49.1988253,49.4892045 49.2288253,49.4719823 49.230492,49.4469823 C49.2338253,49.4175379 49.2127142,49.4075379 49.2532697,49.4003156 Z M48.2932697,41.9630934 C48.3249364,41.9964268 48.3632697,42.0064268 48.3560475,42.0603156 C48.3971586,42.0653156 48.4227142,42.0808712 48.4460475,42.0464268 C48.4599364,42.0247601 48.4827142,42.0080934 48.5066031,41.9992045 C48.5366031,41.9875379 48.6588253,41.988649 48.6532697,42.0380934 C48.650492,42.0630934 48.6349364,42.0853156 48.6310475,42.1092045 C48.6260475,42.1430934 48.6621586,42.118649 48.6793808,42.1275379 C48.660492,42.1397601 48.6382697,42.1480934 48.6160475,42.153649 C48.6260475,42.1592045 48.6316031,42.1680934 48.6332697,42.1792045 C48.605492,42.1858712 48.5916031,42.2625379 48.5432697,42.2775379 C48.5132697,42.2869823 48.470492,42.2669823 48.440492,42.2630934 C48.405492,42.258649 48.3788253,42.248649 48.3438253,42.2464268 C48.3093808,42.2442045 48.3371586,42.1997601 48.2949364,42.2080934 C48.2871586,42.2375379 48.3027142,42.3142045 48.3071586,42.343649 C48.3132697,42.3814268 48.3443808,42.4030934 48.3816031,42.4092045 C48.4332697,42.4175379 48.4582697,42.4347601 48.5027142,42.4597601 C48.5377142,42.4797601 48.5771586,42.4680934 48.615492,42.4714268 C48.6399364,42.473649 48.6616031,42.483649 48.680492,42.498649 C48.6766031,42.5108712 48.6677142,42.5303156 48.6732697,42.5430934 C48.6810475,42.5597601 48.7349364,42.5403156 48.7482697,42.5392045 C48.7860475,42.5353156 48.8216031,42.493649 48.8577142,42.4992045 C48.8716031,42.5014268 48.935492,42.5208712 48.9327142,42.5364268 C48.8982697,42.5225379 48.8760475,42.5647601 48.8499364,42.5414268 C48.8260475,42.5208712 48.7632697,42.5392045 48.8038253,42.5675379 C48.8077142,42.5703156 48.8182697,42.6508712 48.8171586,42.6592045 C48.8143808,42.6897601 48.760492,42.7214268 48.7643808,42.7408712 C48.7716031,42.7419823 48.820492,42.7458712 48.8316031,42.7547601 C48.8349364,42.7414268 48.8249364,42.7364268 48.8549364,42.7280934 C48.8771586,42.7214268 48.9032697,42.7192045 48.925492,42.7297601 C48.9349364,42.7669823 48.9071586,42.8058712 48.9588253,42.7964268 C49.0077142,42.7869823 49.0288253,42.818649 49.0799364,42.7858712 C49.1110475,42.7664268 49.1460475,42.7703156 49.1732697,42.7969823 C49.2099364,42.8342045 49.1349364,42.8842045 49.1777142,42.9192045 C49.1949364,42.933649 49.2088253,42.9764268 49.225492,42.9842045 C49.2371586,42.9892045 49.3010475,42.9669823 49.3127142,42.9608712 C49.3327142,42.9980934 49.3510475,42.9425379 49.3677142,42.938649 C49.3727142,42.9158712 49.4027142,42.8880934 49.4316031,42.8853156 C49.4743808,42.8814268 49.4749364,42.888649 49.5038253,42.908649 C49.5871586,42.9669823 49.575492,42.8253156 49.6193808,42.7892045 C49.6982697,42.7247601 49.7371586,42.6642045 49.7910475,42.5808712 C49.8338253,42.5153156 49.8927142,42.498649 49.9677142,42.4869823 C50.0277142,42.4775379 50.1182697,42.463649 50.1427142,42.3997601 C50.1716031,42.3247601 50.1032697,42.283649 50.0421586,42.2614268 C49.9743808,42.2375379 49.8977142,42.2119823 49.9277142,42.1264268 C49.9627142,42.0269823 49.9321586,41.9692045 49.8266031,41.9369823 C49.6027142,41.8675379 49.4010475,41.7503156 49.1732697,41.6864268 C48.9716031,41.6303156 48.7682697,41.6092045 48.5610475,41.5980934 C48.4688253,41.5664268 48.2743808,41.5630934 48.2177142,41.6414268 C48.1810475,41.6919823 48.2277142,41.7358712 48.2232697,41.788649 C48.2177142,41.8514268 48.2488253,41.9158712 48.2932697,41.9630934 Z M47.8549364,50.1964268 C47.8977142,50.2175379 47.9710475,50.1764268 48.0121586,50.1630934 C48.0627142,50.1475379 48.1432697,50.0942045 48.195492,50.123649 C48.2166031,50.1353156 48.2266031,50.1597601 48.2499364,50.1697601 C48.2771586,50.1814268 48.3099364,50.1708712 48.3371586,50.1647601 C48.3660475,50.1580934 48.3982697,50.153649 48.4249364,50.1408712 C48.4482697,50.1297601 48.4632697,50.1103156 48.4832697,50.0947601 C48.5360475,50.0558712 48.580492,50.0925379 48.6377142,50.0842045 C48.6699364,50.0797601 48.700492,50.063649 48.7327142,50.0558712 C48.7560475,50.0497601 48.7971586,50.0503156 48.815492,50.0330934 C48.8360475,50.013649 48.8266031,49.9719823 48.8260475,49.9475379 C48.8249364,49.9142045 48.8277142,49.8803156 48.815492,49.848649 C48.7921586,49.7875379 48.7077142,49.7158712 48.7949364,49.6680934 C48.8121586,49.5608712 48.6877142,49.5792045 48.6516031,49.5019823 C48.6282697,49.4514268 48.620492,49.4130934 48.5538253,49.4075379 C48.4966031,49.4025379 48.4638253,49.4319823 48.4143808,49.4514268 C48.3593808,49.4725379 48.3171586,49.4542045 48.2693808,49.4269823 C48.2410475,49.4108712 48.1799364,49.373649 48.1682697,49.4230934 C48.1582697,49.4658712 48.1988253,49.5075379 48.1649364,49.5458712 C48.135492,49.5797601 48.0838253,49.5953156 48.0410475,49.6047601 C47.9488253,49.6242045 47.8766031,49.6942045 47.8099364,49.7553156 L47.8166031,49.7619823 C47.790492,49.7614268 47.750492,49.8314268 47.7493808,49.8530934 C47.7599364,49.8558712 47.770492,49.8592045 47.7816031,49.8625379 C47.7799364,49.8992045 47.8221586,49.8747601 47.8243808,49.848649 C47.8332697,49.8503156 47.8421586,49.8558712 47.850492,49.8575379 C47.8577142,49.8592045 47.8738253,49.858649 47.8810475,49.8614268 C47.8982697,49.8692045 47.9016031,49.8864268 47.9243808,49.888649 C47.9110475,49.9442045 47.9227142,50.0030934 47.895492,50.0547601 C47.8788253,50.0875379 47.7927142,50.1669823 47.8549364,50.1964268 Z M42.7410475,50.5614268 C42.7532697,50.5408712 42.7432697,50.4858712 42.720492,50.4675379 C42.6638253,50.4208712 42.6421586,50.5319823 42.6777142,50.5647601 C42.6916031,50.5997601 42.7249364,50.588649 42.7410475,50.5614268 Z M45.9971586,42.3703156 C45.9777142,42.3692045 45.9566031,42.3708712 45.9388253,42.378649 C45.9343808,42.3803156 45.9288253,42.3847601 45.9249364,42.3892045 C45.9316031,42.3903156 45.9382697,42.3903156 45.9443808,42.388649 C45.9632697,42.3847601 45.9777142,42.3714268 45.9971586,42.3703156 Z M48.0010475,41.6769823 C48.0016031,41.6792045 48.0021586,41.6819823 48.0027142,41.6842045 C48.035492,41.6769823 48.0677142,41.6869823 48.0988253,41.6747601 C48.1149364,41.6680934 48.1660475,41.6497601 48.1632697,41.628649 C48.1577142,41.5892045 47.9893808,41.6147601 47.9621586,41.6264268 C47.9532697,41.6508712 47.9793808,41.6703156 48.0010475,41.6769823 Z M45.9310475,42.053649 C45.9727142,42.0225379 45.995492,41.9653156 46.0621586,41.9769823 C46.0599364,42.0342045 46.1160475,42.0414268 46.1571586,42.0630934 C46.1443808,42.0969823 46.0982697,42.0958712 46.0777142,42.1225379 C46.0521586,42.1553156 46.0982697,42.1847601 46.1216031,42.1992045 C46.1671586,42.2275379 46.1427142,42.258649 46.1332697,42.2992045 C46.120492,42.3547601 46.2410475,42.3397601 46.2671586,42.338649 C46.3132697,42.3358712 46.385492,42.3442045 46.4282697,42.3219823 C46.475492,42.2969823 46.4999364,42.2397601 46.5482697,42.2119823 C46.5882697,42.1892045 46.645492,42.1758712 46.690492,42.1919823 C46.7371586,42.2080934 46.7316031,42.2675379 46.7693808,42.293649 C46.8149364,42.3242045 46.8627142,42.3342045 46.9016031,42.2880934 C46.925492,42.258649 46.980492,42.2225379 46.9827142,42.1919823 C46.9866031,42.1375379 47.0021586,42.0942045 47.0632697,42.0825379 C47.1110475,42.0730934 47.1010475,42.1203156 47.1349364,42.128649 C47.2093808,42.1475379 47.245492,41.918649 47.3277142,41.9864268 C47.3471586,42.0025379 47.3527142,42.0642045 47.3849364,42.0592045 C47.4188253,42.053649 47.4199364,42.003649 47.4566031,42.0030934 C47.4682697,42.0369823 47.3932697,42.0775379 47.3832697,42.1130934 C47.4293808,42.0758712 47.4516031,42.0808712 47.5038253,42.0758712 C47.5177142,42.1114268 47.415492,42.168649 47.3893808,42.1753156 C47.3521586,42.183649 47.3299364,42.1630934 47.3016031,42.1825379 C47.2788253,42.198649 47.2482697,42.1969823 47.2221586,42.1997601 C47.1843808,42.2030934 47.1149364,42.2525379 47.115492,42.293649 C47.115492,42.3097601 47.1282697,42.3458712 47.1149364,42.3592045 C47.1016031,42.3725379 47.0716031,42.3597601 47.0677142,42.3458712 C47.035492,42.3930934 46.9949364,42.3108712 46.9682697,42.3769823 C47.0110475,42.3869823 47.0493808,42.428649 47.0977142,42.4403156 C47.1449364,42.4519823 47.190492,42.4630934 47.2371586,42.4769823 C47.3138253,42.5003156 47.4293808,42.4075379 47.4893808,42.3619823 C47.5449364,42.3203156 47.6160475,42.2258712 47.6310475,42.1580934 C47.6477142,42.0853156 47.7288253,42.0003156 47.7121586,41.9269823 C47.6966031,41.8592045 47.6860475,41.8264268 47.7632697,41.8025379 C47.7966031,41.7919823 47.875492,41.7747601 47.8871586,41.7364268 C47.9043808,41.6808712 47.7299364,41.6958712 47.7032697,41.683649 C47.6149364,41.6442045 47.5771586,41.5997601 47.475492,41.6392045 C47.4221586,41.6597601 47.3699364,41.6769823 47.3149364,41.6919823 C47.2860475,41.6997601 47.2571586,41.7019823 47.2416031,41.7258712 C47.235492,41.7358712 47.2271586,41.743649 47.2166031,41.748649 C47.1710475,41.7664268 47.2271586,41.6803156 47.2321586,41.6747601 C47.2471586,41.6580934 47.2716031,41.6053156 47.2238253,41.6164268 C47.1538253,41.6330934 47.1032697,41.7403156 47.0271586,41.7458712 C46.9699364,41.7497601 46.9882697,41.6992045 47.0038253,41.6703156 C47.0316031,41.6180934 46.9499364,41.6119823 46.9138253,41.6114268 C46.8638253,41.6114268 46.8249364,41.6403156 46.7766031,41.6453156 C46.7310475,41.6503156 46.6782697,41.6592045 46.6327142,41.6575379 C46.540492,41.6542045 46.480492,41.7075379 46.3899364,41.6775379 C46.2949364,41.6464268 46.1916031,41.7258712 46.0999364,41.7369823 C46.0693808,41.7408712 46.0243808,41.7342045 46.0121586,41.7708712 C46.0016031,41.8008712 46.0121586,41.8475379 46.035492,41.8697601 L46.0427142,41.863649 C46.0227142,41.8830934 46.0199364,41.9119823 45.9910475,41.9225379 C45.9621586,41.9330934 45.9332697,41.9703156 45.9182697,41.9953156 C45.9066031,42.0158712 45.8738253,42.0953156 45.9310475,42.053649 Z M46.0216031,43.2903156 C46.045492,43.2597601 45.9877142,43.2325379 45.9543808,43.2358712 C45.9632697,43.1980934 46.010492,43.178649 45.9982697,43.1314268 C45.9860475,43.0825379 45.9271586,43.0919823 45.895492,43.118649 C45.8660475,43.143649 45.8510475,43.1864268 45.8266031,43.2147601 C45.8132697,43.2314268 45.7882697,43.2364268 45.7788253,43.2564268 C45.7699364,43.2747601 45.780492,43.3053156 45.7799364,43.3253156 C45.8188253,43.3303156 45.860492,43.318649 45.8888253,43.2908712 L45.9077142,43.2819823 C45.9038253,43.2858712 45.9010475,43.293649 45.8993808,43.2975379 C45.9182697,43.3214268 46.0032697,43.3147601 46.0216031,43.2903156 Z M43.5977142,52.0842045 C43.6038253,52.0658712 43.575492,52.0453156 43.5560475,52.0469823 C43.5388253,52.0480934 43.5232697,52.0708712 43.5160475,52.083649 C43.4960475,52.1214268 43.5193808,52.1719823 43.5682697,52.1719823 C43.5793808,52.1514268 43.5749364,52.1114268 43.605492,52.108649 C43.6038253,52.0992045 43.5971586,52.0958712 43.5882697,52.0925379 L43.5977142,52.0842045 Z M53.2532697,50.4553156 C53.2510475,50.4464268 53.2488253,50.4369823 53.2471586,50.4275379 C53.2038253,50.4147601 53.175492,50.4603156 53.135492,50.4269823 C53.0582697,50.478649 53.1410475,50.583649 53.0138253,50.5764268 C53.035492,50.6030934 53.0332697,50.633649 53.0232697,50.6642045 C53.0066031,50.7130934 52.9949364,50.708649 52.9616031,50.7142045 C52.8932697,50.7258712 52.8593808,50.6825379 52.8388253,50.6253156 C52.7710475,50.6264268 52.6777142,50.7319823 52.6238253,50.7647601 C52.6110475,50.7730934 52.5860475,50.7953156 52.5710475,50.8042045 C52.5593808,50.8114268 52.5310475,50.8253156 52.5160475,50.8330934 C52.480492,50.8519823 52.4027142,50.8764268 52.3982697,50.9169823 C52.380492,50.9142045 52.3527142,50.9247601 52.335492,50.9225379 C52.3293808,50.9314268 52.3293808,50.9408712 52.335492,50.9497601 C52.4177142,50.9642045 52.4610475,50.9364268 52.530492,50.9058712 C52.6043808,50.873649 52.6832697,50.8803156 52.7516031,50.8547601 C52.7843808,50.8430934 52.785492,50.8064268 52.8393808,50.828649 C52.8627142,50.838649 52.8910475,50.8730934 52.8960475,50.8969823 C52.9066031,50.9503156 52.850492,51.0292045 52.7943808,51.0330934 C52.7810475,50.9997601 52.7999364,50.9658712 52.8060475,50.938649 C52.7327142,50.913649 52.610492,51.018649 52.5899364,51.0808712 C52.6671586,51.0964268 52.6982697,51.208649 52.6577142,51.2692045 C52.6438253,51.2842045 52.6282697,51.303649 52.6010475,51.3119823 C52.5577142,51.3247601 52.5371586,51.2847601 52.4949364,51.3164268 C52.4393808,51.3580934 52.500492,51.4725379 52.4688253,51.5369823 C52.4443808,51.5858712 52.4027142,51.6042045 52.3682697,51.638649 C52.3443808,51.6630934 52.3310475,51.6897601 52.2988253,51.7114268 C52.2571586,51.7392045 52.1566031,51.798649 52.165492,51.8569823 C52.2560475,51.8875379 52.4449364,51.7292045 52.5238253,51.6769823 C52.5738253,51.643649 52.6038253,51.5919823 52.6549364,51.5597601 C52.7121586,51.523649 52.7877142,51.5058712 52.8249364,51.4419823 C52.8460475,51.4064268 52.8293808,51.3742045 52.8421586,51.3380934 C52.8532697,51.3058712 52.8760475,51.2953156 52.8971586,51.2703156 C52.9360475,51.2230934 52.9727142,51.208649 53.0171586,51.1692045 C53.0721586,51.1203156 53.0593808,51.0430934 53.0843808,50.9780934 C53.1066031,50.9208712 53.150492,50.8780934 53.180492,50.8247601 C53.2288253,50.7392045 53.3538253,50.5375379 53.3016031,50.4430934 C53.2882697,50.4530934 53.2643808,50.4508712 53.2532697,50.4553156 Z M51.8121586,51.8869823 L51.810492,51.8853156 C51.8138253,51.8914268 51.8127142,51.9003156 51.8132697,51.9080934 C51.8549364,51.9080934 51.8727142,51.9453156 51.9171586,51.9319823 C51.9632697,51.918649 51.9888253,51.8753156 51.9527142,51.8392045 C51.9216031,51.8075379 51.8938253,51.7814268 51.8466031,51.7897601 C51.7921586,51.8003156 51.8043808,51.8442045 51.8121586,51.8869823 Z M42.780492,47.3764268 C42.7943808,47.3864268 42.8127142,47.3953156 42.8266031,47.4047601 C42.840492,47.4147601 42.8621586,47.4319823 42.8788253,47.4364268 C42.9177142,47.4575379 42.9777142,47.4814268 43.0066031,47.4364268 C43.015492,47.4180934 43.0210475,47.4064268 43.010492,47.3908712 C42.9988253,47.3747601 42.9821586,47.3703156 42.9777142,47.3575379 C42.9727142,47.3442045 42.9843808,47.3347601 42.970492,47.3247601 C42.9549364,47.3108712 42.9432697,47.3197601 42.9421586,47.2903156 C42.9432697,47.2653156 42.9449364,47.2147601 42.9110475,47.2469823 C42.9021586,47.2497601 42.9143808,47.2553156 42.900492,47.2603156 C42.8916031,47.263649 42.8838253,47.2564268 42.8777142,47.2530934 C42.8593808,47.2453156 42.8482697,47.243649 42.835492,47.2630934 C42.8249364,47.2769823 42.825492,47.2914268 42.8088253,47.3025379 L42.7821586,47.3114268 C42.7727142,47.3147601 42.7443808,47.3347601 42.7432697,47.3447601 C42.7388253,47.3614268 42.7638253,47.3725379 42.780492,47.3764268 Z M52.1093808,51.7808712 C52.115492,51.7503156 52.1788253,51.6397601 52.1199364,51.623649 C52.0988253,51.6175379 52.080492,51.6503156 52.0610475,51.6558712 C52.0360475,51.663649 52.0088253,51.6475379 51.9849364,51.6603156 C51.9632697,51.6714268 51.9438253,51.7058712 51.9310475,51.7253156 C51.9149364,51.7492045 51.9210475,51.7580934 51.9466031,51.7714268 C51.9727142,51.7853156 52.005492,51.7919823 52.0199364,51.8197601 C52.0332697,51.8447601 52.0266031,51.8769823 52.0227142,51.9030934 C52.0238253,51.9014268 52.0271586,51.8980934 52.0282697,51.893649 C52.0327142,51.8925379 52.0399364,51.8914268 52.0443808,51.8925379 L52.0388253,51.903649 C52.1071586,51.9130934 52.1016031,51.8253156 52.1093808,51.7808712 Z M54.3488253,48.1230934 C54.3282697,48.0014268 54.3982697,47.8325379 54.335492,47.7158712 C54.3082697,47.6647601 54.3499364,47.5169823 54.3493808,47.4564268 C54.3482697,47.3442045 54.3149364,47.258649 54.2993808,47.153649 C54.2888253,47.0558712 54.2760475,46.7947601 54.3116031,46.7058712 C54.3621586,46.5803156 54.1143808,46.3680934 54.100492,46.2325379 C54.0882697,46.1153156 54.0210475,46.003649 53.9249364,45.9358712 C53.885492,45.9075379 53.800492,45.5192045 53.750492,45.5369823 C53.725492,45.548649 53.7771586,45.6342045 53.7738253,45.6608712 C53.760492,45.7558712 53.7127142,45.6614268 53.6621586,45.6825379 C53.570492,45.7203156 53.4732697,45.8080934 53.4610475,45.8997601 C53.4171586,46.2369823 53.1782697,45.888649 53.1971586,45.8742045 C53.250492,45.8330934 53.2693808,45.8458712 53.3310475,45.8369823 C53.400492,45.8125379 53.2932697,45.763649 53.4021586,45.7530934 C53.3766031,45.6842045 53.4332697,45.6614268 53.405492,45.6064268 C53.3643808,45.5264268 53.3349364,45.5358712 53.3766031,45.4497601 C53.3943808,45.4019823 53.2866031,45.253649 53.2777142,45.1964268 C53.2688253,45.1408712 53.2677142,45.068649 53.260492,45.0064268 C53.2560475,44.9669823 53.3210475,44.928649 53.3099364,44.8980934 C53.3071586,44.7875379 53.3316031,44.6680934 53.2927142,44.5619823 C53.265492,44.488649 53.2338253,44.3930934 53.1871586,44.3308712 C53.170492,44.308649 53.120492,44.1980934 53.1160475,44.1680934 C53.1027142,44.0992045 53.0721586,44.1253156 53.0332697,44.0975379 C53.0121586,44.0714268 52.9166031,43.9825379 52.8888253,43.9697601 C52.8638253,43.9580934 52.6793808,43.7897601 52.6749364,43.7764268 C52.6599364,43.7275379 52.5560475,43.6903156 52.5671586,43.6380934 C52.5843808,43.5580934 52.3071586,43.3525379 52.2299364,43.3397601 C52.1799364,43.3308712 52.3827142,43.5719823 52.3816031,43.5675379 C52.3849364,43.5814268 52.5121586,43.7425379 52.5116031,43.7425379 C52.5410475,43.7525379 52.610492,43.9503156 52.6082697,43.9758712 C52.600492,44.0514268 52.4066031,43.8530934 52.3921586,43.8264268 C52.2971586,43.7092045 52.1232697,43.6153156 52.0143808,43.5369823 C51.9371586,43.4658712 51.975492,43.4247601 51.8432697,43.3642045 C51.7938253,43.3414268 51.6616031,43.2325379 51.620492,43.2308712 C51.570492,43.2275379 51.6271586,43.3330934 51.6288253,43.3447601 C51.6366031,43.4197601 51.7182697,43.4253156 51.7666031,43.4747601 C51.8060475,43.5147601 51.840492,43.5653156 51.8066031,43.6097601 C51.8060475,43.6103156 51.745492,43.7214268 51.7421586,43.7114268 C51.7593808,43.758649 51.8999364,43.8630934 51.9349364,43.9019823 C51.9288253,43.8914268 52.1199364,44.1408712 52.1360475,44.008649 C52.1421586,43.9608712 52.0882697,43.9025379 52.095492,43.8614268 C52.100492,43.8347601 52.3138253,44.103649 52.3249364,44.1275379 C52.3777142,44.2697601 52.3732697,44.1058712 52.4271586,44.1225379 C52.4721586,44.1369823 52.5916031,44.2853156 52.4927142,44.2914268 C52.3399364,44.3019823 52.5199364,44.433649 52.5621586,44.453649 C52.650492,44.4964268 52.7099364,44.5958712 52.8021586,44.6330934 C52.9449364,44.6914268 52.9149364,44.7942045 52.9877142,44.8992045 C53.010492,44.9325379 52.5760475,44.898649 52.5416031,44.918649 C52.4843808,44.9625379 52.7599364,45.2708712 52.7616031,45.3169823 C52.7638253,45.4130934 52.8182697,45.483649 52.8327142,45.5803156 C52.8421586,45.6692045 52.8310475,45.7858712 52.8893808,45.8575379 C52.9371586,45.9014268 52.9816031,45.7847601 53.0566031,45.853649 C53.0843808,45.8664268 53.1238253,45.8975379 53.1327142,45.9214268 C53.1571586,45.9875379 53.3016031,46.393649 53.1288253,46.3630934 C53.0527142,46.3497601 53.0960475,46.6819823 53.1010475,46.7303156 C53.125492,46.8353156 53.1671586,46.8275379 53.1399364,46.9597601 C53.1427142,47.0703156 53.0532697,47.1258712 52.990492,47.2047601 C52.9610475,47.2408712 52.9416031,47.283649 52.9271586,47.3297601 C52.8921586,47.2958712 52.875492,47.2414268 52.8271586,47.2230934 C52.7738253,47.2030934 52.6571586,47.2664268 52.610492,47.2897601 C52.4977142,47.3458712 52.580492,47.448649 52.5366031,47.5375379 C52.5049364,47.6025379 52.4088253,47.6347601 52.3471586,47.6669823 C52.2716031,47.7053156 52.1710475,47.7464268 52.0960475,47.6847601 C52.0327142,47.6325379 52.060492,47.5292045 51.9932697,47.4842045 C51.9177142,47.433649 51.9110475,47.5464268 51.8938253,47.5908712 C51.8610475,47.6758712 51.7627142,47.7047601 51.7877142,47.8108712 C51.7982697,47.8542045 51.820492,47.893649 51.8293808,47.9375379 C51.8399364,47.9925379 51.8127142,48.0419823 51.8088253,48.0964268 C51.8032697,48.1892045 51.8999364,48.2108712 51.9260475,48.2875379 C51.9482697,48.3547601 51.9249364,48.4614268 51.8482697,48.4875379 C51.7666031,48.5158712 51.6766031,48.4419823 51.5960475,48.433649 C51.5149364,48.4253156 51.4127142,48.4480934 51.3971586,48.5397601 C51.3832697,48.6214268 51.4666031,48.6875379 51.4266031,48.7708712 C51.4093808,48.8058712 51.3799364,48.833649 51.3577142,48.8658712 C51.3210475,48.9192045 51.300492,48.9819823 51.265492,49.0364268 C51.3066031,49.0375379 51.3027142,49.0119823 51.3393808,49.0197601 C51.3788253,49.0275379 51.4132697,48.988649 51.4466031,48.9753156 C51.4521586,49.0008712 51.4493808,49.0275379 51.4527142,49.053649 C51.4799364,49.0619823 51.5077142,49.0508712 51.5321586,49.0414268 C51.535492,49.0642045 51.5249364,49.0903156 51.5343808,49.1125379 C51.5421586,49.1319823 51.5638253,49.1380934 51.5766031,49.1530934 C51.6099364,49.1930934 51.5693808,49.2580934 51.5460475,49.2919823 C51.4788253,49.3903156 51.3649364,49.4453156 51.290492,49.5369823 C51.220492,49.6230934 51.2138253,49.7264268 51.1621586,49.8197601 C51.1443808,49.8514268 51.1260475,49.8953156 51.1743808,49.9108712 C51.1838253,49.893649 51.2010475,49.8797601 51.2221586,49.8797601 C51.255492,49.8792045 51.2432697,49.9030934 51.2593808,49.9230934 C51.3288253,50.0103156 51.4021586,49.8653156 51.4310475,49.823649 C51.4616031,49.7797601 51.5843808,49.7119823 51.6188253,49.7869823 C51.6449364,49.843649 51.6143808,49.9242045 51.5877142,49.9753156 C51.6316031,49.9953156 51.6193808,50.0275379 51.6293808,50.0658712 C51.6432697,50.1192045 51.6927142,50.153649 51.6927142,50.2119823 C51.6927142,50.2830934 51.5377142,50.4242045 51.5977142,50.4769823 C51.6732697,50.5430934 51.7627142,50.3597601 51.7916031,50.3203156 C51.8482697,50.2442045 51.9766031,50.233649 52.0077142,50.1397601 C52.0432697,50.0342045 52.0310475,49.9714268 52.1732697,49.9680934 C52.2327142,49.9669823 52.275492,49.928649 52.3316031,49.9175379 C52.3932697,49.9053156 52.420492,49.898649 52.4599364,49.8514268 C52.5166031,49.7847601 52.5666031,49.8647601 52.5693808,49.9180934 C52.5716031,49.9730934 52.5471586,50.0419823 52.580492,50.0903156 C52.6221586,50.1508712 52.6682697,50.0708712 52.7099364,50.0330934 C52.7060475,50.0730934 52.760492,50.0969823 52.7916031,50.1097601 C52.8410475,50.0764268 52.8716031,50.0219823 52.9238253,49.9919823 C52.9482697,49.978649 52.975492,49.9730934 53.0027142,49.9680934 C53.010492,50.0119823 53.0177142,50.0592045 53.0571586,50.0808712 C53.1132697,50.1130934 53.0443808,50.1442045 53.1182697,50.178649 C53.2110475,50.213649 53.2416031,50.3069823 53.2866031,50.3819823 C53.3071586,50.4158712 53.4999364,50.2080934 53.5749364,50.1997601 C53.820492,50.1719823 53.9482697,49.8525379 54.0399364,49.6625379 C54.1716031,49.3919823 54.230492,49.0908712 54.2649364,48.8108712 C54.3488253,48.6392045 54.3827142,48.323649 54.3488253,48.1230934 Z M52.9038253,50.4425379 C52.9049364,50.4747601 52.9399364,50.4703156 52.9643808,50.4625379 C52.9849364,50.4558712 52.9988253,50.4375379 53.0121586,50.4208712 C53.0316031,50.3969823 53.0427142,50.3719823 53.0266031,50.343649 C53.0088253,50.3130934 52.9982697,50.2914268 52.9899364,50.2564268 C52.9760475,50.2642045 52.9593808,50.2764268 52.9449364,50.2819823 C52.9293808,50.2869823 52.9277142,50.2825379 52.9110475,50.2819823 C52.8716031,50.2797601 52.8793808,50.3103156 52.8627142,50.3347601 C52.8488253,50.3558712 52.8182697,50.3647601 52.8299364,50.3925379 C52.8388253,50.413649 52.8738253,50.4325379 52.8932697,50.4414268 L52.8988253,50.4358712 C52.8977142,50.4369823 52.8966031,50.438649 52.895492,50.4403156 C52.8982697,50.4414268 52.9010475,50.4419823 52.9038253,50.4425379 Z M42.7499364,50.8092045 C42.7449364,50.7747601 42.7316031,50.7530934 42.705492,50.7330934 C42.7043808,50.7358712 42.7032697,50.738649 42.7032697,50.7425379 C42.6677142,50.7247601 42.6627142,50.6564268 42.6149364,50.6614268 C42.5743808,50.5975379 42.4716031,50.6258712 42.440492,50.6853156 C42.4193808,50.7247601 42.4443808,50.7419823 42.4682697,50.7714268 C42.4977142,50.8075379 42.4921586,50.8353156 42.5027142,50.8780934 C42.5293808,50.9858712 42.6193808,50.9114268 42.6832697,50.9542045 C42.7071586,50.9692045 42.7177142,51.0158712 42.7527142,51.0075379 C42.7932697,50.998649 42.7910475,50.938649 42.780492,50.9114268 C42.7660475,50.8730934 42.755492,50.8508712 42.7499364,50.8092045 Z M42.6960475,50.7253156 C42.6993808,50.7280934 42.7027142,50.7303156 42.705492,50.7330934 C42.7082697,50.7275379 42.7121586,50.723649 42.7143808,50.7164268 L42.6960475,50.7253156 Z M52.7827142,52.1864268 C52.740492,52.2058712 52.665492,52.1958712 52.6321586,52.2269823 C52.6138253,52.243649 52.6188253,52.263649 52.6110475,52.2842045 C52.6010475,52.308649 52.5638253,52.3175379 52.5438253,52.3308712 C52.5116031,52.3519823 52.5010475,52.3992045 52.4666031,52.4114268 C52.4516031,52.3892045 52.4288253,52.3253156 52.3988253,52.3808712 C52.3799364,52.4153156 52.3927142,52.4503156 52.3632697,52.4830934 C52.335492,52.513649 52.3371586,52.5497601 52.3171586,52.5830934 C52.2860475,52.6353156 52.2560475,52.6664268 52.2038253,52.6975379 C52.1616031,52.7225379 52.1538253,52.7675379 52.1238253,52.8025379 C52.0916031,52.8392045 52.0438253,52.853649 51.9999364,52.8725379 C51.9693808,52.8858712 51.9182697,52.9225379 51.8838253,52.9014268 C51.8360475,52.8725379 51.900492,52.8214268 51.9227142,52.8030934 C51.9432697,52.7858712 52.0438253,52.7253156 52.0210475,52.6908712 C52.005492,52.668649 51.9471586,52.6714268 51.9243808,52.673649 C51.8771586,52.678649 51.840492,52.7264268 51.800492,52.7497601 C51.755492,52.7753156 51.7160475,52.7969823 51.6666031,52.8142045 C51.6088253,52.8342045 51.6038253,52.8875379 51.5588253,52.9203156 C51.5221586,52.9475379 51.4766031,52.9692045 51.4293808,52.9692045 C51.3677142,52.968649 51.3710475,52.9180934 51.3532697,52.8753156 C51.3299364,52.8780934 51.3093808,52.908649 51.2877142,52.9180934 C51.2510475,52.9330934 51.2282697,52.9492045 51.2432697,52.9897601 C51.2588253,53.0297601 51.0943808,53.0680934 51.0660475,53.0880934 C51.0588253,53.0680934 51.0910475,53.0458712 51.1038253,53.0347601 C51.0527142,53.0303156 50.9960475,53.0742045 50.9443808,53.0814268 C50.8943808,53.088649 50.8327142,53.1219823 50.825492,53.1742045 C50.8199364,53.2142045 50.7649364,53.213649 50.7316031,53.2275379 C50.675492,53.2503156 50.6988253,53.2842045 50.6877142,53.3292045 C50.6666031,53.4142045 50.4899364,53.3492045 50.5799364,53.2369823 C50.6116031,53.1975379 50.6593808,53.1719823 50.6882697,53.1308712 C50.7210475,53.0842045 50.7260475,53.0247601 50.7516031,52.9742045 C50.695492,52.9903156 50.6527142,53.0225379 50.6049364,53.053649 C50.5510475,53.0892045 50.505492,53.0808712 50.445492,53.068649 C50.375492,53.053649 50.3271586,53.0892045 50.2621586,53.1047601 C50.220492,53.1147601 50.1282697,53.1114268 50.1232697,53.1714268 C50.1199364,53.2097601 50.1866031,53.2180934 50.2088253,53.2403156 C50.2421586,53.2742045 50.2771586,53.3247601 50.305492,53.3630934 C50.3282697,53.393649 50.410492,53.4353156 50.405492,53.473649 C50.3960475,53.5480934 50.3027142,53.5353156 50.2510475,53.548649 C50.1999364,53.5614268 50.1927142,53.6069823 50.155492,53.6347601 C50.1138253,53.6653156 50.0566031,53.6297601 50.0093808,53.648649 C49.9616031,53.6675379 49.9277142,53.7092045 49.8860475,53.7380934 C49.8160475,53.7853156 49.7710475,53.7330934 49.6988253,53.7303156 C49.6410475,53.7280934 49.5871586,53.7542045 49.5321586,53.7664268 C49.4821586,53.7775379 49.4227142,53.7858712 49.3832697,53.8214268 C49.300492,53.8958712 49.5699364,53.8764268 49.5943808,53.873649 C49.5832697,53.9169823 49.5721586,53.9669823 49.5327142,53.9953156 C49.4838253,54.0303156 49.4149364,54.0219823 49.3588253,54.0347601 C49.3149364,54.0447601 49.2543808,54.093649 49.3182697,54.1269823 C49.3749364,54.1564268 49.4488253,54.1408712 49.505492,54.1208712 C49.5716031,54.0980934 49.6332697,54.0630934 49.7021586,54.048649 C49.7743808,54.0325379 49.8493808,54.0397601 49.9221586,54.0264268 C49.9993808,54.0125379 50.0671586,53.9697601 50.1388253,53.9408712 C50.2077142,53.9130934 50.2793808,53.9030934 50.3538253,53.9003156 C50.3382697,53.9269823 50.2660475,53.9258712 50.2388253,53.9308712 C50.1843808,53.9419823 50.1477142,53.9892045 50.0910475,53.9864268 C50.0277142,53.983649 50.035492,54.0292045 49.9893808,54.0397601 C49.9599364,54.0464268 49.8893808,54.1153156 49.8671586,54.0730934 C49.8499364,54.0397601 49.8177142,54.0464268 49.8066031,54.0864268 C49.7982697,54.1164268 49.815492,54.1275379 49.7743808,54.1280934 C49.7416031,54.1280934 49.7277142,54.1153156 49.6982697,54.1080934 C49.6416031,54.093649 49.6160475,54.1519823 49.575492,54.1669823 C49.5160475,54.1892045 49.4527142,54.1825379 49.3960475,54.2197601 C49.3627142,54.2414268 49.3266031,54.2475379 49.2877142,54.2592045 C49.2160475,54.2808712 49.1493808,54.308649 49.0788253,54.3325379 C49.0232697,54.3508712 48.9682697,54.3742045 48.9088253,54.3753156 C48.8843808,54.3758712 48.7877142,54.3592045 48.7716031,54.3875379 C48.7416031,54.4408712 48.8327142,54.4208712 48.8521586,54.4103156 C48.9060475,54.3814268 48.9710475,54.3980934 49.0316031,54.3980934 C49.1060475,54.3980934 49.1682697,54.3830934 49.2343808,54.348649 C49.2527142,54.3397601 49.3727142,54.313649 49.3782697,54.3280934 C49.3893808,54.3342045 49.4693808,54.3053156 49.4827142,54.3019823 C49.5471586,54.2875379 49.6116031,54.2730934 49.6749364,54.2569823 C49.8710475,54.2064268 50.0643808,54.1303156 50.2560475,54.0653156 C50.6366031,53.9364268 50.9866031,53.7197601 51.3166031,53.4992045 C51.4666031,53.3992045 51.5882697,53.268649 51.750492,53.1875379 C51.9138253,53.1058712 52.0599364,52.9980934 52.2099364,52.8964268 C52.3566031,52.7964268 52.4677142,52.6597601 52.5893808,52.5342045 C52.7121586,52.4075379 52.8166031,52.2869823 52.8710475,52.1180934 C52.8399364,52.1114268 52.8082697,52.1742045 52.7827142,52.1864268 Z M48.9610475,53.198649 C49.0593808,53.0614268 48.9949364,52.8830934 49.075492,52.7403156 C49.1149364,52.6708712 49.1843808,52.6269823 49.2466031,52.578649 C49.3221586,52.5208712 49.3888253,52.453649 49.4488253,52.3803156 C49.4138253,52.3719823 49.4116031,52.3380934 49.3899364,52.3169823 C49.355492,52.283649 49.3038253,52.3058712 49.2960475,52.2553156 C49.2888253,52.2103156 49.2516031,52.2003156 49.215492,52.1819823 C49.1327142,52.1408712 49.0988253,52.0597601 49.0321586,52.0025379 C48.9582697,51.938649 48.8588253,51.9603156 48.770492,51.9425379 C48.6916031,51.9269823 48.6121586,51.8025379 48.5282697,51.8558712 C48.475492,51.888649 48.450492,51.9742045 48.4866031,52.0258712 C48.5149364,52.0669823 48.5643808,52.0869823 48.5838253,52.1353156 C48.5549364,52.1614268 48.5482697,52.1792045 48.5827142,52.203649 C48.6243808,52.2330934 48.7043808,52.2625379 48.6843808,52.3264268 C48.6732697,52.3603156 48.6449364,52.3930934 48.6077142,52.4003156 C48.580492,52.4053156 48.5160475,52.3897601 48.5299364,52.438649 C48.500492,52.358649 48.4166031,52.4825379 48.3716031,52.4180934 C48.3343808,52.3653156 48.3110475,52.318649 48.2527142,52.2830934 C48.1766031,52.2364268 48.2827142,52.1925379 48.2699364,52.1219823 C48.2510475,52.0203156 48.1271586,52.0480934 48.0821586,51.973649 C48.0566031,51.9303156 48.0927142,51.8964268 48.1093808,51.858649 C48.1260475,51.8203156 48.1721586,51.8508712 48.1960475,51.8625379 C48.275492,51.8997601 48.3927142,51.8864268 48.4593808,51.8308712 C48.490492,51.8053156 48.5582697,51.6864268 48.4716031,51.6875379 C48.4121586,51.6875379 48.3666031,51.7397601 48.310492,51.7430934 C48.3021586,51.6753156 48.2710475,51.5603156 48.3432697,51.5158712 C48.4088253,51.4753156 48.5466031,51.4280934 48.4877142,51.3225379 C48.4671586,51.2864268 48.4299364,51.3464268 48.3993808,51.3203156 C48.3860475,51.308649 48.3949364,51.2842045 48.3999364,51.2725379 C48.3793808,51.253649 48.360492,51.2319823 48.3499364,51.2064268 C48.3032697,51.0930934 48.4410475,51.003649 48.3832697,50.8842045 C48.3588253,50.833649 48.3171586,50.803649 48.2716031,50.7719823 C48.2260475,50.7403156 48.2238253,50.7003156 48.2071586,50.6519823 C48.1977142,50.6247601 48.1538253,50.5619823 48.115492,50.5775379 C48.0827142,50.5908712 48.0727142,50.6469823 48.0482697,50.6708712 C47.990492,50.7269823 47.870492,50.7475379 47.7927142,50.7297601 C47.7321586,50.7164268 47.7349364,50.6925379 47.705492,50.6514268 C47.695492,50.6369823 47.6743808,50.6353156 47.6588253,50.6292045 C47.630492,50.618649 47.6282697,50.5942045 47.6216031,50.5692045 C47.5960475,50.4764268 47.4110475,50.5914268 47.3827142,50.4614268 C47.3766031,50.4314268 47.3866031,50.3803156 47.3438253,50.373649 C47.2943808,50.3658712 47.2927142,50.318649 47.2927142,50.2792045 C47.2921586,50.2469823 47.295492,50.2019823 47.2610475,50.183649 C47.2171586,50.1603156 47.2066031,50.1708712 47.1932697,50.1214268 C47.1766031,50.0580934 47.1332697,50.1242045 47.0977142,50.1103156 C47.0216031,50.0814268 47.0349364,50.118649 46.9738253,50.1508712 C46.8688253,50.2058712 46.8577142,49.9480934 46.820492,49.8975379 C46.750492,49.8014268 46.7693808,50.0169823 46.7216031,50.043649 C46.6771586,50.0675379 46.6321586,50.0119823 46.6166031,49.978649 C46.6071586,49.958649 46.6010475,49.9375379 46.5893808,49.9180934 C46.5721586,49.8903156 46.5399364,49.878649 46.5221586,49.8508712 C46.5066031,49.8258712 46.4849364,49.7969823 46.4743808,49.7703156 C46.4649364,49.7469823 46.4666031,49.7169823 46.4488253,49.6975379 C46.4266031,49.673649 46.4532697,49.6325379 46.4699364,49.6014268 C46.4977142,49.5914268 46.5388253,49.6125379 46.5588253,49.6297601 C46.6088253,49.6725379 46.6843808,49.8547601 46.7710475,49.8214268 C46.7532697,49.7975379 46.7643808,49.768649 46.7516031,49.7430934 C46.7388253,49.7164268 46.7116031,49.7003156 46.6921586,49.6780934 C46.6466031,49.6269823 46.5977142,49.5764268 46.5682697,49.5142045 C46.5427142,49.4597601 46.5310475,49.403649 46.4788253,49.3664268 C46.4349364,49.3342045 46.3449364,49.3042045 46.3688253,49.2342045 C46.4049364,49.2408712 46.4299364,49.2692045 46.4560475,49.2919823 C46.4932697,49.323649 46.540492,49.3403156 46.5843808,49.3614268 C46.6643808,49.4003156 46.7560475,49.4275379 46.8243808,49.4858712 C46.8660475,49.5219823 46.8443808,49.5997601 46.8971586,49.6442045 C46.9360475,49.6764268 46.995492,49.7847601 47.0666031,49.7419823 C47.0938253,49.7253156 47.1049364,49.6942045 47.1310475,49.6764268 C47.1599364,49.6564268 47.2082697,49.6375379 47.240492,49.6225379 C47.2610475,49.613649 47.2943808,49.6158712 47.3110475,49.5997601 C47.3360475,49.5758712 47.275492,49.5053156 47.2616031,49.4869823 C47.2077142,49.4175379 47.1582697,49.3419823 47.0860475,49.2892045 C47.0488253,49.2619823 47.0127142,49.2330934 46.9699364,49.2153156 C46.945492,49.2058712 46.9049364,49.2069823 46.8999364,49.1742045 C46.9116031,49.1819823 46.9188253,49.1797601 46.9210475,49.1680934 C46.9199364,49.1464268 46.8888253,49.1458712 46.8738253,49.1414268 C46.8382697,49.1314268 46.8138253,49.1314268 46.7993808,49.1019823 C46.7816031,49.0647601 46.7177142,49.0664268 46.6838253,49.0575379 C46.6327142,49.0447601 46.5927142,49.0064268 46.5443808,48.9875379 C46.4866031,48.9653156 46.4432697,48.988649 46.3877142,49.0008712 C46.3310475,49.0130934 46.1093808,49.553649 46.0532697,49.5675379 C45.9982697,49.5814268 45.9193808,49.5358712 45.9116031,49.4530934 C45.9371586,49.4880934 45.7666031,49.263649 45.7738253,49.2503156 C45.4832697,49.7653156 45.785492,49.4464268 45.7871586,49.4192045 C45.7882697,49.3897601 45.880492,49.2375379 46.0571586,48.8608712 C46.0943808,48.7797601 46.0116031,49.6203156 45.9282697,49.6592045 C45.8593808,49.6914268 45.7871586,49.6364268 45.7066031,49.6203156 C45.6610475,49.6114268 45.6943808,49.2264268 45.6438253,49.2580934 C45.315492,49.4669823 45.6538253,49.7625379 45.5893808,49.7697601 C45.4888253,49.7803156 45.1749364,49.8158712 45.0710475,49.8030934 C45.0243808,49.7975379 45.0349364,49.6919823 44.8871586,49.4608712 C44.8682697,49.4314268 44.7827142,49.1308712 44.765492,49.1625379 C44.7427142,49.2025379 44.6332697,49.5842045 44.6243808,49.5475379 C44.5832697,49.5797601 44.6849364,48.9958712 44.5910475,49.1125379 C44.5688253,49.1403156 44.2343808,49.5142045 44.2010475,49.5169823 C44.1766031,49.5197601 44.4682697,49.1347601 44.4482697,49.1419823 C44.3988253,49.1592045 44.0688253,49.6108712 44.0277142,49.6403156 C43.9721586,49.6803156 44.0288253,49.4903156 43.9616031,49.543649 C43.9016031,49.5919823 44.0810475,49.3692045 44.0249364,49.4214268 C43.9860475,49.4569823 43.9099364,49.4997601 43.9038253,49.5569823 C43.8977142,49.6214268 43.930492,49.6658712 43.8827142,49.7258712 C43.8638253,49.7492045 43.8416031,49.7697601 43.8243808,49.7942045 C43.810492,49.8142045 43.8071586,49.8475379 43.7832697,49.8597601 C43.7182697,49.893649 43.7349364,49.913649 43.7543808,49.9842045 C43.7710475,50.043649 43.7649364,50.1553156 43.7510475,50.2164268 C43.7410475,50.2630934 43.6938253,50.3764268 43.6366031,50.3492045 C43.6066031,50.3353156 43.5749364,50.323649 43.5471586,50.3503156 C43.5349364,50.3625379 43.5266031,50.3769823 43.5227142,50.393649 C43.5032697,50.3942045 43.4843808,50.3964268 43.465492,50.4008712 C43.4299364,50.4080934 43.3910475,50.4169823 43.3566031,50.4019823 C43.3216031,50.3869823 43.275492,50.3580934 43.2360475,50.3708712 C43.2027142,50.3819823 43.1377142,50.4103156 43.1238253,50.4447601 C43.1182697,50.4603156 43.1382697,50.4997601 43.1377142,50.5197601 C43.1371586,50.5564268 43.1660475,50.6108712 43.1543808,50.6447601 C43.1271586,50.6308712 43.0882697,50.6264268 43.0699364,50.6008712 C43.0527142,50.5775379 43.0277142,50.5825379 43.0088253,50.5592045 C43.0043808,50.6003156 42.9893808,50.6564268 42.9416031,50.6675379 C42.8938253,50.678649 42.8482697,50.6408712 42.800492,50.6530934 C42.6760475,50.6858712 42.8760475,50.8419823 42.9027142,50.8725379 C42.9471586,50.9225379 42.9627142,50.988649 42.995492,51.0458712 C43.030492,51.1075379 43.105492,51.128649 43.1488253,51.1830934 C43.1849364,51.228649 43.1927142,51.2914268 43.2438253,51.3253156 C43.3016031,51.3642045 43.3532697,51.4003156 43.3771586,51.4675379 C43.4016031,51.443649 43.4521586,51.5547601 43.5038253,51.4658712 C43.5321586,51.4175379 43.5799364,51.3758712 43.6110475,51.4547601 C43.6371586,51.5214268 43.6116031,51.5653156 43.6688253,51.623649 C43.7143808,51.6692045 43.7116031,51.723649 43.635492,51.7192045 C43.6482697,51.753649 43.6688253,51.7869823 43.6360475,51.8180934 C43.620492,51.8330934 43.5782697,51.8642045 43.6093808,51.8858712 C43.6438253,51.8697601 43.6816031,51.8603156 43.7160475,51.8447601 C43.7538253,51.8280934 43.7916031,51.7892045 43.835492,51.7903156 C43.8388253,51.8042045 43.7771586,51.8458712 43.8149364,51.848649 C43.8466031,51.8514268 43.8916031,51.8180934 43.9177142,51.8458712 C43.9466031,51.8764268 43.910492,51.9219823 43.9271586,51.9558712 C43.9438253,51.9897601 44.0010475,51.9642045 44.0293808,51.9692045 C44.0166031,51.9992045 43.9727142,51.993649 43.9488253,52.0053156 C44.0049364,52.0742045 43.9316031,52.1753156 43.8499364,52.1764268 C43.810492,52.1769823 43.6710475,52.0180934 43.665492,52.1203156 C43.6638253,52.1508712 43.6732697,52.1875379 43.6832697,52.2164268 C43.6960475,52.253649 43.7877142,52.2380934 43.8199364,52.2519823 C43.8671586,52.2714268 43.9232697,52.3169823 43.9416031,52.3647601 C43.960492,52.4142045 44.0016031,52.4464268 44.0177142,52.4942045 C44.0471586,52.5814268 44.1316031,52.5930934 44.2188253,52.618649 C44.3349364,52.6530934 44.2777142,52.8325379 44.2716031,52.9180934 C44.2660475,53.0025379 44.385492,53.0225379 44.4399364,53.0703156 C44.4999364,53.1225379 44.5099364,53.2247601 44.4093808,53.2330934 C44.3582697,53.2375379 44.2738253,53.2142045 44.2549364,53.2792045 C44.2277142,53.3719823 44.3677142,53.3614268 44.4282697,53.3825379 C44.4571586,53.3919823 44.5727142,53.4042045 44.5832697,53.4308712 C44.5993808,53.4719823 44.5860475,53.528649 44.6010475,53.573649 C44.6371586,53.6847601 44.7421586,53.7603156 44.8421586,53.8158712 C45.0582697,53.9364268 45.3149364,54.0130934 45.5527142,54.0808712 C45.6849364,54.118649 45.8199364,54.1480934 45.9560475,54.1669823 C46.0866031,54.1847601 46.2032697,54.173649 46.3149364,54.2469823 C46.3921586,54.2969823 46.4416031,54.2597601 46.5210475,54.2730934 C46.5549364,54.2792045 46.5699364,54.3103156 46.5949364,54.3292045 C46.6238253,54.3508712 46.6566031,54.3225379 46.6877142,54.3342045 C46.6921586,54.3142045 46.6899364,54.2942045 46.6810475,54.2753156 C46.7410475,54.2975379 46.815492,54.3619823 46.8788253,54.3103156 C46.910492,54.2847601 46.9321586,54.2492045 46.9649364,54.2247601 C47.0038253,54.2275379 47.0427142,54.2297601 47.0816031,54.2303156 C47.2466031,54.2308712 47.3760475,54.1553156 47.5071586,54.0675379 C47.6477142,53.973649 47.8177142,53.9714268 47.9810475,53.9558712 C48.1538253,53.9392045 48.3377142,53.9169823 48.4949364,53.8414268 C48.6332697,53.7753156 48.6682697,53.6542045 48.7071586,53.5203156 C48.7493808,53.3747601 48.8771586,53.3158712 48.9610475,53.198649 Z M51.5738253,52.108649 C51.6182697,52.1203156 51.6893808,52.0925379 51.7171586,52.0553156 C51.7549364,52.0042045 51.7232697,51.9369823 51.6577142,51.9753156 C51.6332697,51.9897601 51.6360475,52.0169823 51.6177142,52.0342045 C51.5966031,52.0525379 51.5943808,52.0308712 51.5749364,52.0264268 C51.545492,52.0197601 51.4993808,52.0580934 51.4899364,52.083649 C51.450492,52.0825379 51.415492,52.1264268 51.4338253,52.1614268 C51.485492,52.1419823 51.5171586,52.0930934 51.5738253,52.108649 Z"/>
@@ -112,13 +111,12 @@
   <use id="tag" xlink:href="#tag-shape"/>
   <use id="tag-hover" xlink:href="#tag-shape"/>
   <use id="tag-active" xlink:href="#tag-shape"/>
   <use id="trash" xlink:href="#trash-shape"/>
   <use id="unblock" xlink:href="#unblock-shape"/>
   <use id="unblock-hover" xlink:href="#unblock-shape"/>
   <use id="unblock-active" xlink:href="#unblock-shape"/>
   <use id="video" xlink:href="#video-shape"/>
-  <use id="tour" xlink:href="#tour-shape"/>
   <use id="delete" xlink:href="#delete-shape"/>
   <use id="status-available" xlink:href="#status-available-shape"/>
   <use id="status-unavailable" xlink:href="#status-unavailable-shape"/>
 </svg>
deleted file mode 100644
--- a/browser/components/loop/content/shared/img/svg/glyph-account-16x16.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" fill="#231f20" d="M8,6.526c1.802,0,3.263-1.461,3.263-3.263 C11.263,1.461,9.802,0,8,0C6.198,0,4.737,1.461,4.737,3.263C4.737,5.066,6.198,6.526,8,6.526z M14.067,11.421c0,0,0-0.001,0-0.001 c0-1.676-1.397-3.119-3.419-3.807L8.001,10.26L5.354,7.613C3.331,8.3,1.933,9.744,1.933,11.42v0.001H1.93 c0,1.679,0.328,3.246,0.896,4.579h10.348c0.568-1.333,0.896-2.9,0.896-4.579H14.067z"/>
-</svg>
deleted file mode 100644
--- a/browser/components/loop/content/shared/img/svg/glyph-signin-16x16.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" fill="#231f20" d="M9.921,8.415c0.105-0.11,0.146-0.265,0.13-0.432 c0.016-0.166-0.025-0.321-0.13-0.429L9.305,6.938l-2.6-2.65C6.402,3.973,5.973,3.906,5.748,4.139L5.238,4.68 c-0.225,0.233-0.16,0.679,0.144,0.995L6.44,6.754H0.608C0.272,6.754,0,7.026,0,7.361l0,1.215c0,0.335,0.272,0.607,0.608,0.607H6.47 l-1.136,1.155c-0.305,0.313-0.369,0.756-0.144,0.987L5.7,11.861c0.225,0.233,0.654,0.166,0.959-0.149l2.619-2.663L9.921,8.415z"/>
-  <path fill-rule="evenodd" fill="#231f20" d="M14,0H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8 c0,0.331,0.269,0.6,0.6,0.6H12.5C13.328,2,14,2.672,14,3.5v9c0,0.828-0.672,1.5-1.5,1.5H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8 c0,0.331,0.269,0.6,0.6,0.6H14c1.105,0,2-0.895,2-2V2C16,0.895,15.105,0,14,0z"/>
-</svg>
deleted file mode 100644
--- a/browser/components/loop/content/shared/img/svg/glyph-signout-16x16.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" fill="#231f20" d="M14,0H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8 c0,0.331,0.269,0.6,0.6,0.6H12.5C13.328,2,14,2.672,14,3.5v9c0,0.828-0.672,1.5-1.5,1.5H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8 c0,0.331,0.269,0.6,0.6,0.6H14c1.105,0,2-0.895,2-2V2C16,0.895,15.105,0,14,0z"/>
-  <path fill-rule="evenodd" fill="#231f20" d="M0.133,7.585c-0.105,0.11-0.146,0.265-0.13,0.432 c-0.016,0.166,0.025,0.321,0.13,0.429l0.616,0.615l2.6,2.65c0.304,0.315,0.732,0.382,0.958,0.149l0.51-0.541 c0.225-0.233,0.16-0.679-0.144-0.995L3.615,9.246h5.832c0.335,0,0.608-0.272,0.608-0.607V7.424c0-0.335-0.272-0.607-0.608-0.607 H3.585L4.72,5.662c0.305-0.313,0.369-0.756,0.144-0.987L4.355,4.139C4.13,3.906,3.701,3.973,3.396,4.287L0.777,6.951L0.133,7.585z"/>
-</svg>
--- a/browser/components/loop/jar.mn
+++ b/browser/components/loop/jar.mn
@@ -50,19 +50,16 @@ browser.jar:
   content/browser/loop/shared/img/hangup-inverse-14x14.png      (content/shared/img/hangup-inverse-14x14.png)
   content/browser/loop/shared/img/hangup-inverse-14x14@2x.png   (content/shared/img/hangup-inverse-14x14@2x.png)
   content/browser/loop/shared/img/mute-inverse-14x14.png        (content/shared/img/mute-inverse-14x14.png)
   content/browser/loop/shared/img/mute-inverse-14x14@2x.png     (content/shared/img/mute-inverse-14x14@2x.png)
   content/browser/loop/shared/img/video-inverse-14x14.png       (content/shared/img/video-inverse-14x14.png)
   content/browser/loop/shared/img/video-inverse-14x14@2x.png    (content/shared/img/video-inverse-14x14@2x.png)
   content/browser/loop/shared/img/dropdown-inverse.png          (content/shared/img/dropdown-inverse.png)
   content/browser/loop/shared/img/dropdown-inverse@2x.png       (content/shared/img/dropdown-inverse@2x.png)
-  content/browser/loop/shared/img/svg/glyph-account-16x16.svg   (content/shared/img/svg/glyph-account-16x16.svg)
-  content/browser/loop/shared/img/svg/glyph-signin-16x16.svg    (content/shared/img/svg/glyph-signin-16x16.svg)
-  content/browser/loop/shared/img/svg/glyph-signout-16x16.svg   (content/shared/img/svg/glyph-signout-16x16.svg)
   content/browser/loop/shared/img/svg/glyph-help-16x16.svg      (content/shared/img/svg/glyph-help-16x16.svg)
   content/browser/loop/shared/img/svg/exit.svg                  (content/shared/img/svg/exit.svg)
   content/browser/loop/shared/img/svg/audio.svg                 (content/shared/img/svg/audio.svg)
   content/browser/loop/shared/img/svg/audio-hover.svg           (content/shared/img/svg/audio-hover.svg)
   content/browser/loop/shared/img/svg/audio-mute.svg            (content/shared/img/svg/audio-mute.svg)
   content/browser/loop/shared/img/svg/audio-mute-hover.svg      (content/shared/img/svg/audio-mute-hover.svg)
   content/browser/loop/shared/img/svg/video.svg                 (content/shared/img/svg/video.svg)
   content/browser/loop/shared/img/svg/video-hover.svg           (content/shared/img/svg/video-hover.svg)
--- a/browser/components/loop/standalone/content/js/standaloneRoomViews.js
+++ b/browser/components/loop/standalone/content/js/standaloneRoomViews.js
@@ -477,20 +477,26 @@ loop.standaloneRoomViews = (function(moz
      * user media access.
      *
      * @param  {Object} nextProps (Unused)
      * @param  {Object} nextState Next state object.
      */
     componentWillUpdate: function(nextProps, nextState) {
       if (this.state.roomState !== ROOM_STATES.READY &&
           nextState.roomState === ROOM_STATES.READY) {
-        this.setTitle(mozL10n.get("standalone_title_with_room_name", {
-          roomName: nextState.roomName || this.state.roomName,
-          clientShortname: mozL10n.get("clientShortname2")
-        }));
+        var roomName = nextState.roomName || this.state.roomName;
+
+        if (roomName) {
+          this.setTitle(mozL10n.get("standalone_title_with_room_name", {
+            roomName: roomName,
+            clientShortname: mozL10n.get("clientShortname2")
+          }));
+        } else {
+          this.setTitle(mozL10n.get("clientShortname2"));
+        }
       }
 
       if (this.state.roomState !== ROOM_STATES.MEDIA_WAIT &&
           nextState.roomState === ROOM_STATES.MEDIA_WAIT) {
         this.props.dispatcher.dispatch(new sharedActions.SetupStreamElements({
           publisherConfig: this.getDefaultPublisherConfig({publishVideo: true})
         }));
       }
--- a/browser/components/loop/standalone/content/js/standaloneRoomViews.jsx
+++ b/browser/components/loop/standalone/content/js/standaloneRoomViews.jsx
@@ -477,20 +477,26 @@ loop.standaloneRoomViews = (function(moz
      * user media access.
      *
      * @param  {Object} nextProps (Unused)
      * @param  {Object} nextState Next state object.
      */
     componentWillUpdate: function(nextProps, nextState) {
       if (this.state.roomState !== ROOM_STATES.READY &&
           nextState.roomState === ROOM_STATES.READY) {
-        this.setTitle(mozL10n.get("standalone_title_with_room_name", {
-          roomName: nextState.roomName || this.state.roomName,
-          clientShortname: mozL10n.get("clientShortname2")
-        }));
+        var roomName = nextState.roomName || this.state.roomName;
+
+        if (roomName) {
+          this.setTitle(mozL10n.get("standalone_title_with_room_name", {
+            roomName: roomName,
+            clientShortname: mozL10n.get("clientShortname2")
+          }));
+        } else {
+          this.setTitle(mozL10n.get("clientShortname2"));
+        }
       }
 
       if (this.state.roomState !== ROOM_STATES.MEDIA_WAIT &&
           nextState.roomState === ROOM_STATES.MEDIA_WAIT) {
         this.props.dispatcher.dispatch(new sharedActions.SetupStreamElements({
           publisherConfig: this.getDefaultPublisherConfig({publishVideo: true})
         }));
       }
--- a/browser/components/loop/standalone/package.json
+++ b/browser/components/loop/standalone/package.json
@@ -9,16 +9,17 @@
   "engines": {
     "node": "0.10.x",
     "npm": "1.3.x"
   },
   "dependencies": {},
   "devDependencies": {
     "compression": "1.5.x",
     "eslint": "1.2.x",
+    "eslint-plugin-mozilla": "../../../../testing/eslint-plugin-mozilla",
     "eslint-plugin-react": "3.2.x",
     "exports-loader": "0.6.x",
     "express": "4.x",
     "imports-loader": "0.6.x",
     "script-loader": "0.6.x",
     "webpack": "1.12.x"
   },
   "scripts": {
--- a/browser/components/loop/test/standalone/standaloneRoomViews_test.js
+++ b/browser/components/loop/test/standalone/standaloneRoomViews_test.js
@@ -367,16 +367,24 @@ describe("loop.standaloneRoomViews", fun
       it("should set document.title to roomName and brand name when the READY state is dispatched", function() {
         activeRoomStore.setStoreState({roomName: "fakeName", roomState: ROOM_STATES.INIT});
         view = mountTestComponent();
         activeRoomStore.setStoreState({roomState: ROOM_STATES.READY});
 
         expect(fakeWindow.document.title).to.equal("fakeName — clientShortname2");
       });
 
+      it("should set document.title brand name when there is no context available", function() {
+        activeRoomStore.setStoreState({roomState: ROOM_STATES.INIT});
+        view = mountTestComponent();
+        activeRoomStore.setStoreState({roomState: ROOM_STATES.READY});
+
+        expect(fakeWindow.document.title).to.equal("clientShortname2");
+      });
+
       it("should dispatch a `SetupStreamElements` action when the MEDIA_WAIT state " +
         "is entered", function() {
           activeRoomStore.setStoreState({roomState: ROOM_STATES.READY});
           view = mountTestComponent();
 
           activeRoomStore.setStoreState({roomState: ROOM_STATES.MEDIA_WAIT});
 
           expectActionDispatched(view);
--- a/browser/components/loop/ui/ui-showcase.js
+++ b/browser/components/loop/ui/ui-showcase.js
@@ -599,17 +599,17 @@
         "volume-disabled", "clear", "magnifier"
       ],
       "16x16": ["add", "add-hover", "add-active", "audio", "audio-hover", "audio-active",
         "block", "block-red", "block-hover", "block-active", "contacts", "contacts-hover",
         "contacts-active", "copy", "checkmark", "delete", "globe", "google", "google-hover",
         "google-active", "history", "history-hover", "history-active", "leave",
         "screen-white", "screenmute-white", "settings", "settings-hover", "settings-active",
         "share-darkgrey", "tag", "tag-hover", "tag-active", "trash", "unblock",
-        "unblock-hover", "unblock-active", "video", "video-hover", "video-active", "tour",
+        "unblock-hover", "unblock-active", "video", "video-hover", "video-active",
         "status-available", "status-unavailable"
       ]
     },
 
     render: function() {
       var icons = this.shapes[this.props.size].map(function(shapeId, i) {
         return (
           React.createElement("li", {className: "svg-icon-entry", key: this.props.size + "-" + i}, 
--- a/browser/components/loop/ui/ui-showcase.jsx
+++ b/browser/components/loop/ui/ui-showcase.jsx
@@ -599,17 +599,17 @@
         "volume-disabled", "clear", "magnifier"
       ],
       "16x16": ["add", "add-hover", "add-active", "audio", "audio-hover", "audio-active",
         "block", "block-red", "block-hover", "block-active", "contacts", "contacts-hover",
         "contacts-active", "copy", "checkmark", "delete", "globe", "google", "google-hover",
         "google-active", "history", "history-hover", "history-active", "leave",
         "screen-white", "screenmute-white", "settings", "settings-hover", "settings-active",
         "share-darkgrey", "tag", "tag-hover", "tag-active", "trash", "unblock",
-        "unblock-hover", "unblock-active", "video", "video-hover", "video-active", "tour",
+        "unblock-hover", "unblock-active", "video", "video-hover", "video-active",
         "status-available", "status-unavailable"
       ]
     },
 
     render: function() {
       var icons = this.shapes[this.props.size].map(function(shapeId, i) {
         return (
           <li className="svg-icon-entry" key={this.props.size + "-" + i}>
--- a/browser/components/places/content/browserPlacesViews.js
+++ b/browser/components/places/content/browserPlacesViews.js
@@ -383,18 +383,17 @@ PlacesViewBase.prototype = {
       }
       else
         throw "Unexpected node";
 
       element.setAttribute("label", PlacesUIUtils.getBestTitle(aPlacesNode));
 
       let icon = aPlacesNode.icon;
       if (icon)
-        element.setAttribute("image",
-                             PlacesUtils.getImageURLForResolution(window, icon));
+        element.setAttribute("image", icon);
     }
 
     element._placesNode = aPlacesNode;
     if (!this._domNodes.has(aPlacesNode))
       this._domNodes.set(aPlacesNode, element);
 
     return element;
   },
@@ -522,18 +521,17 @@ PlacesViewBase.prototype = {
     // Here we need the <menu>.
     if (elt.localName == "menupopup")
       elt = elt.parentNode;
 
     let icon = aPlacesNode.icon;
     if (!icon)
       elt.removeAttribute("image");
     else if (icon != elt.getAttribute("image"))
-      elt.setAttribute("image",
-                       PlacesUtils.getImageURLForResolution(window, icon));
+      elt.setAttribute("image", icon);
   },
 
   nodeAnnotationChanged:
   function PVB_nodeAnnotationChanged(aPlacesNode, aAnno) {
     let elt = this._getDOMNodeForPlacesNode(aPlacesNode);
 
     // All livemarks have a feedURI, so use it as our indicator of a livemark
     // being modified.
@@ -1053,18 +1051,17 @@ PlacesToolbar.prototype = {
       button = document.createElement("toolbarseparator");
     }
     else {
       button = document.createElement("toolbarbutton");
       button.className = "bookmark-item";
       button.setAttribute("label", aChild.title || "");
       let icon = aChild.icon;
       if (icon)
-        button.setAttribute("image",
-                            PlacesUtils.getImageURLForResolution(window, icon));
+        button.setAttribute("image", icon);
 
       if (PlacesUtils.containerTypes.indexOf(type) != -1) {
         button.setAttribute("type", "menu");
         button.setAttribute("container", "true");
 
         if (PlacesUtils.nodeIsQuery(aChild)) {
           button.setAttribute("query", "true");
           if (PlacesUtils.nodeIsTagQuery(aChild))
@@ -1881,18 +1878,17 @@ PlacesPanelMenuView.prototype = {
     else {
       button = document.createElement("toolbarbutton");
       button.className = "bookmark-item";
       if (typeof this.options.extraClasses.entry == "string")
         button.classList.add(this.options.extraClasses.entry);
       button.setAttribute("label", aChild.title || "");
       let icon = aChild.icon;
       if (icon)
-        button.setAttribute("image",
-                            PlacesUtils.getImageURLForResolution(window, icon));
+        button.setAttribute("image", icon);
 
       if (PlacesUtils.containerTypes.indexOf(type) != -1) {
         button.setAttribute("container", "true");
 
         if (PlacesUtils.nodeIsQuery(aChild)) {
           button.setAttribute("query", "true");
           if (PlacesUtils.nodeIsTagQuery(aChild))
             button.setAttribute("tagContainer", "true");
--- a/browser/components/places/content/treeView.js
+++ b/browser/components/places/content/treeView.js
@@ -1409,19 +1409,16 @@ PlacesTreeView.prototype = {
   },
 
   getImageSrc: function PTV_getImageSrc(aRow, aColumn) {
     // Only the title column has an image.
     if (this._getColumnType(aColumn) != this.COLUMN_TYPE_TITLE)
       return "";
 
     let node = this._getNodeForRow(aRow);
-    if (PlacesUtils.nodeIsURI(node) && node.icon)
-      return PlacesUtils.getImageURLForResolution(window, node.icon);
-
     return node.icon;
   },
 
   getProgressMode: function(aRow, aColumn) { },
   getCellValue: function(aRow, aColumn) { },
 
   getCellText: function PTV_getCellText(aRow, aColumn) {
     let node = this._getNodeForRow(aRow);
--- a/browser/components/preferences/in-content/advanced.js
+++ b/browser/components/preferences/in-content/advanced.js
@@ -1,17 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 // Load DownloadUtils module for convertByteUnits
 Components.utils.import("resource://gre/modules/DownloadUtils.jsm");
 Components.utils.import("resource://gre/modules/LoadContextInfo.jsm");
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-Components.utils.import("resource://gre/modules/BrowserUtils.jsm");
 
 var gAdvancedPane = {
   _inited: false,
 
   /**
    * Brings the appropriate tab to the front and initializes various bits of UI.
    */
   init: function ()
@@ -567,17 +566,17 @@ var gAdvancedPane = {
     }
   },
 
   removeOfflineApp: function()
   {
     var list = document.getElementById("offlineAppsList");
     var item = list.selectedItem;
     var origin = item.getAttribute("origin");
-    var principal = BrowserUtils.principalFromOrigin(origin);
+    var principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(origin);
 
     var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
                             .getService(Components.interfaces.nsIPromptService);
     var flags = prompts.BUTTON_TITLE_IS_STRING * prompts.BUTTON_POS_0 +
                 prompts.BUTTON_TITLE_CANCEL * prompts.BUTTON_POS_1;
 
     var bundle = document.getElementById("bundlePreferences");
     var title = bundle.getString("offlineAppRemoveTitle");
--- a/browser/components/preferences/in-content/search.js
+++ b/browser/components/preferences/in-content/search.js
@@ -111,18 +111,17 @@ var gSearchPane = {
       currentEngine = engines[0].name;
 
     // Now clean-up and rebuild the list.
     list.removeAllItems();
     gEngineView._engineStore._engines.forEach(e => {
       let item = list.appendItem(e.name);
       item.setAttribute("class", "menuitem-iconic searchengine-menuitem menuitem-with-favicon");
       if (e.iconURI) {
-        let uri = PlacesUtils.getImageURLForResolution(window, e.iconURI.spec);
-        item.setAttribute("image", uri);
+        item.setAttribute("image", e.iconURI.spec);
       }
       item.engine = e;
       if (e.name == currentEngine)
         list.selectedItem = item;
     });
   },
 
   handleEvent: function(aEvent) {
@@ -483,18 +482,17 @@ EngineView.prototype = {
 
   // nsITreeView
   get rowCount() {
     return this._engineStore.engines.length;
   },
 
   getImageSrc: function(index, column) {
     if (column.id == "engineName" && this._engineStore.engines[index].iconURI) {
-      let uri = this._engineStore.engines[index].iconURI.spec;
-      return PlacesUtils.getImageURLForResolution(window, uri);
+      return this._engineStore.engines[index].iconURI.spec;
     }
     return "";
   },
 
   getCellText: function(index, column) {
     if (column.id == "engineName")
       return this._engineStore.engines[index].name;
     else if (column.id == "engineKeyword")
--- a/browser/components/preferences/translation.js
+++ b/browser/components/preferences/translation.js
@@ -4,17 +4,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/BrowserUtils.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "gLangBundle", () =>
   Services.strings.createBundle("chrome://global/locale/languageNames.properties"));
 
 const kPermissionType = "translate";
 const kLanguagesPref = "browser.translation.neverForLanguages";
 
 function Tree(aId, aData)
@@ -209,30 +208,30 @@ var gTranslationExceptions = {
 
   onAllLanguagesDeleted: function() {
     Services.prefs.setCharPref(kLanguagesPref, "");
   },
 
   onSiteDeleted: function() {
     let removedSites = this._siteTree.getSelectedItems();
     for (let origin of removedSites) {
-      let principal = BrowserUtils.principalFromOrigin(origin);
+      let principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(origin);
       Services.perms.removeFromPrincipal(principal, kPermissionType);
     }
   },
 
   onAllSitesDeleted: function() {
     if (this._siteTree.isEmpty)
       return;
 
     let removedSites = this._sites.splice(0, this._sites.length);
     this._siteTree.boxObject.rowCountChanged(0, -removedSites.length);
 
     for (let origin of removedSites) {
-      let principal = BrowserUtils.principalFromOrigin(origin);
+      let principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(origin);
       Services.perms.removeFromPrincipal(principal, kPermissionType);
     }
 
     this.onSiteSelected();
   },
 
   onSiteKeyPress: function(aEvent) {
     if (aEvent.keyCode == KeyEvent.DOM_VK_DELETE)
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -260,19 +260,16 @@
           BrowserSearch.updateOpenSearchBadge();
         ]]></body>
       </method>
 
       <method name="setIcon">
         <parameter name="element"/>
         <parameter name="uri"/>
         <body><![CDATA[
-          if (uri) {
-            uri = this.PlacesUtils.getImageURLForResolution(window, uri);
-          }
           element.setAttribute("src", uri);
         ]]></body>
       </method>
 
       <method name="updateDisplay">
         <body><![CDATA[
           var uri = this.currentEngine.iconURI;
           this.setIcon(this, uri ? uri.spec : "");
@@ -1086,18 +1083,17 @@
         </getter>
       </property>
 
       <method name="updateHeader">
         <body><![CDATA[
           let currentEngine = Services.search.currentEngine;
           let uri = currentEngine.iconURI;
           if (uri) {
-            uri = uri.spec;
-            this.setAttribute("src", PlacesUtils.getImageURLForResolution(window, uri));
+            this.setAttribute("src", uri.spec);
           }
           else {
             // If the default has just been changed to a provider without icon,
             // avoid showing the icon of the previous default provider.
             this.removeAttribute("src");
           }
 
           let headerText = this.bundle.formatStringFromName("searchHeader",
@@ -1249,18 +1245,17 @@
             button.setAttribute("class", "addengine-item");
             button.setAttribute("label", label);
             button.setAttribute("pack", "start");
 
             button.setAttribute("crop", "end");
             button.setAttribute("tooltiptext", engine.uri);
             button.setAttribute("uri", engine.uri);
             if (engine.icon) {
-              let uri = PlacesUtils.getImageURLForResolution(window, engine.icon);
-              button.setAttribute("image", uri);
+              button.setAttribute("image", engine.icon);
             }
             button.setAttribute("title", engine.title);
             addEngineList.appendChild(button);
           }
         }
 
         // Finally, build the list of one-off buttons.
         while (list.firstChild)
@@ -1323,17 +1318,17 @@
 
         let dummyItems = enginesPerRow - (engines.length % enginesPerRow || enginesPerRow);
         for (let i = 0; i < engines.length; ++i) {
           let engine = engines[i];
           let button = document.createElementNS(kXULNS, "button");
           button.id = "searchbar-engine-one-off-item-" + engine.name.replace(/ /g, '-');
           let uri = "chrome://browser/skin/search-engine-placeholder.png";
           if (engine.iconURI) {
-            uri = PlacesUtils.getImageURLForResolution(window, engine.iconURI.spec);
+            uri = engine.iconURI.spec;
           }
           button.setAttribute("image", uri);
           button.setAttribute("class", "searchbar-engine-one-off-item");
           button.setAttribute("tooltiptext", engine.name);
           button.setAttribute("width", buttonWidth);
           button.engine = engine;
 
           if ((i + 1) % enginesPerRow == 0)
--- a/browser/components/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.jsm
+++ b/browser/components/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.jsm
@@ -164,15 +164,15 @@ this.RecentlyClosedTabsAndWindowsMenuUti
       return;
 
     aEvent.view.undoCloseTab(aEvent.originalTarget.getAttribute("value"));
     aEvent.view.gBrowser.moveTabToEnd();
   },
 };
 
 function setImage(aWindow, aItem, aElement) {
-  let iconURL = PlacesUtils.getImageURLForResolution(aWindow, aItem.image);
+  let iconURL = aItem.image;
   // don't initiate a connection just to fetch a favicon (see bug 467828)
   if (/^https?:/.test(iconURL))
     iconURL = "moz-anno:favicon:" + iconURL;
 
   aElement.setAttribute("image", iconURL);
 }
--- a/browser/components/sessionstore/SessionStorage.jsm
+++ b/browser/components/sessionstore/SessionStorage.jsm
@@ -4,17 +4,16 @@
 
 "use strict";
 
 this.EXPORTED_SYMBOLS = ["SessionStorage"];
 
 const Cu = Components.utils;
 const Ci = Components.interfaces;
 
-Cu.import("resource://gre/modules/BrowserUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "console",
   "resource://gre/modules/devtools/shared/Console.jsm");
 
 // Returns the principal for a given |frame| contained in a given |docShell|.
 function getPrincipalForFrame(docShell, frame) {
@@ -100,17 +99,17 @@ var SessionStorageInternal = {
    * @param aStorageData
    *        A nested object with storage data to be restored that has hosts as
    *        keys and per-host session storage data as values. For example:
    *        {"example.com": {"key": "value", "my_number": 123}}
    */
   restore: function (aDocShell, aStorageData) {
     for (let origin of Object.keys(aStorageData)) {
       let data = aStorageData[origin];
-      let principal = BrowserUtils.principalFromOrigin(origin);
+      let principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(origin);
       let storageManager = aDocShell.QueryInterface(Ci.nsIDOMStorageManager);
       let window = aDocShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
 
       // There is no need to pass documentURI, it's only used to fill documentURI property of
       // domstorage event, which in this case has no consumer. Prevention of events in case
       // of missing documentURI will be solved in a followup bug to bug 600307.
       let storage = storageManager.createStorage(window, principal, "", aDocShell.usePrivateBrowsing);
 
--- a/browser/components/tabview/favicons.js
+++ b/browser/components/tabview/favicons.js
@@ -86,34 +86,29 @@ var FavIcons = {
 
     // If the tab image's url starts with http(s), fetch icon from favicon
     // service via the moz-anno protocol.
     if (/^https?:/.test(tabImage)) {
       let tabImageURI = gWindow.makeURI(tabImage);
       tabImage = this._favIconService.getFaviconLinkForIcon(tabImageURI).spec;
     }
 
-    if (tabImage) {
-      tabImage = PlacesUtils.getImageURLForResolution(window, tabImage);
-    }
-
     callback(tabImage);
   },
 
   // ----------
   // Function: _getFavIconForHttpDocument
   // Retrieves the favicon for tab containg a http(s) document.
   _getFavIconForHttpDocument:
     function FavIcons_getFavIconForHttpDocument(tab, callback) {
 
     let {currentURI} = tab.linkedBrowser;
     this._favIconService.getFaviconURLForPage(currentURI, function (uri) {
       if (uri) {
-        let icon = PlacesUtils.getImageURLForResolution(window,
-                     this._favIconService.getFaviconLinkForIcon(uri).spec);
+        let icon = this._favIconService.getFaviconLinkForIcon(uri).spec;
         callback(icon);
       } else {
         callback(this.defaultFavicon);
       }
     }.bind(this));
   },
 
   // ----------
--- a/browser/experiments/Experiments.jsm
+++ b/browser/experiments/Experiments.jsm
@@ -2218,17 +2218,17 @@ this.Experiments.PreviousExperimentProvi
   this._experiments = experiments;
   this._experimentList = [];
   this._log = Log.repository.getLoggerWithMessagePrefix(
     "Browser.Experiments.Experiments",
     "PreviousExperimentProvider #" + gPreviousProviderCounter++ + "::");
 }
 
 this.Experiments.PreviousExperimentProvider.prototype = Object.freeze({
-  get name() "PreviousExperimentProvider",
+  name: "PreviousExperimentProvider",
 
   startup: function () {
     this._log.trace("startup()");
     Services.obs.addObserver(this, EXPERIMENTS_CHANGED_TOPIC, false);
   },
 
   shutdown: function () {
     this._log.trace("shutdown()");
--- a/browser/fuel/fuelApplication.js
+++ b/browser/fuel/fuelApplication.js
@@ -13,44 +13,44 @@ const APPLICATION_CID = Components.ID("f
 const APPLICATION_CONTRACTID = "@mozilla.org/fuel/application;1";
 
 //=================================================
 // Singleton that holds services and utilities
 var Utilities = {
   get bookmarks() {
     let bookmarks = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
                     getService(Ci.nsINavBookmarksService);
-    this.__defineGetter__("bookmarks", function() bookmarks);
+    this.__defineGetter__("bookmarks", () => bookmarks);
     return this.bookmarks;
   },
 
   get bookmarksObserver() {
     let bookmarksObserver = new BookmarksObserver();
-    this.__defineGetter__("bookmarksObserver", function() bookmarksObserver);
+    this.__defineGetter__("bookmarksObserver", () => bookmarksObserver);
     return this.bookmarksObserver;
   },
 
   get annotations() {
     let annotations = Cc["@mozilla.org/browser/annotation-service;1"].
                       getService(Ci.nsIAnnotationService);
-    this.__defineGetter__("annotations", function() annotations);
+    this.__defineGetter__("annotations", () => annotations);
     return this.annotations;
   },
 
   get history() {
     let history = Cc["@mozilla.org/browser/nav-history-service;1"].
                   getService(Ci.nsINavHistoryService);
-    this.__defineGetter__("history", function() history);
+    this.__defineGetter__("history", () => history);
     return this.history;
   },
 
   get windowMediator() {
     let windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"].
                          getService(Ci.nsIWindowMediator);
-    this.__defineGetter__("windowMediator", function() windowMediator);
+    this.__defineGetter__("windowMediator", () => windowMediator);
     return this.windowMediator;
   },
 
   makeURI: function fuelutil_makeURI(aSpec) {
     if (!aSpec)
       return null;
     var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
     return ios.newURI(aSpec, null, null);
--- a/browser/fuel/test/browser_Bookmarks.js
+++ b/browser/fuel/test/browser_Bookmarks.js
@@ -131,20 +131,20 @@ function test() {
   testBookmark.annotations.set("testing/bookmark/double", 3.333, 0);
   ok(testBookmark.annotations.has("testing/bookmark/double"), "Checking existence of added double annotation");
   is(testBookmark.annotations.get("testing/bookmark/double"), 3.333, "Checking value of added double annotation");
   is(gLastBookmarkAction, "testing/bookmark/double", "Check event handler for setting annotation");
   gLastBookmarkAction = "";
 
   // test names array - NOTE: "bookmarkProperties/description" is an annotation too
   var names = testBookmark.annotations.names;
-  ok(names.some(function (f) f == "bookmarkProperties/description"), "Checking for description annotation");
-  ok(names.some(function (f) f == "testing/bookmark/string"), "Checking for string test annotation");
-  ok(names.some(function (f) f == "testing/bookmark/int"), "Checking for int test annotation");
-  ok(names.some(function (f) f == "testing/bookmark/double"), "Checking for double test annotation");
+  ok(names.some(f => f == "bookmarkProperties/description"), "Checking for description annotation");
+  ok(names.some(f => f == "testing/bookmark/string"), "Checking for string test annotation");
+  ok(names.some(f => f == "testing/bookmark/int"), "Checking for int test annotation");
+  ok(names.some(f => f == "testing/bookmark/double"), "Checking for double test annotation");
 
   // test adding a separator
   var testSeparator = testFolder.addSeparator();
   ok(testSeparator, "Check bookmark creation");
   ok(testSeparator.parent, "Check parent after separator creation");
   is(gLastFolderAction, "addchild", "Check event handler for adding a child separator to a folder");
   is(testSeparator.type, "separator", "Check 'bookmark.type' after separator creation");
 
--- a/browser/fuel/test/browser_Browser.js
+++ b/browser/fuel/test/browser_Browser.js
@@ -80,20 +80,20 @@ function test() {
         const complete = Ci.nsIWebProgressListener.STATE_IS_WINDOW +
                          Ci.nsIWebProgressListener.STATE_IS_NETWORK +
                          Ci.nsIWebProgressListener.STATE_STOP;
         if ((stateFlags & complete) == complete) {
           gBrowser.removeProgressListener(this);
           onPageBLoadComplete();
         }
       },
-      onLocationChange: function () 0,
-      onProgressChange: function () 0,
-      onStatusChange: function () 0,
-      onSecurityChange: function () 0
+      onLocationChange: () => 0,
+      onProgressChange: () => 0,
+      onStatusChange: () => 0,
+      onSecurityChange: () => 0
     });
 
     // test loading new content with a frame into a tab
     // the event will be checked in onPageBLoadComplete
     gPageB.events.addListener("load", onPageBLoadWithFrames);
     gPageB.load(makeURI(CHROMEROOT + "ContentWithFrames.html"));
   }
 
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -188,16 +188,17 @@
 @RESPATH@/components/directory.xpt
 @RESPATH@/components/docshell.xpt
 @RESPATH@/components/dom.xpt
 #ifdef MOZ_ACTIVITIES
 @RESPATH@/components/dom_activities.xpt
 @RESPATH@/components/dom_messages.xpt
 #endif
 @RESPATH@/components/dom_apps.xpt
+@RESPATH@/components/dom_newapps.xpt
 @RESPATH@/components/dom_base.xpt
 @RESPATH@/components/dom_system.xpt
 #ifdef MOZ_B2G_BT
 @RESPATH@/components/dom_bluetooth.xpt
 #endif
 @RESPATH@/components/dom_canvas.xpt
 @RESPATH@/components/dom_alarm.xpt
 @RESPATH@/components/dom_core.xpt
@@ -633,16 +634,20 @@
 @RESPATH@/components/url-classifier.xpt
 #endif
 
 ; Private Browsing
 @RESPATH@/components/privatebrowsing.xpt
 @RESPATH@/components/PrivateBrowsing.manifest
 @RESPATH@/components/PrivateBrowsingTrackingProtectionWhitelist.js
 
+; Signed Packaged Content
+@RESPATH@/components/InstallPackagedWebapp.manifest
+@RESPATH@/components/InstallPackagedWebapp.js
+
 ; ANGLE GLES-on-D3D rendering library
 #ifdef MOZ_ANGLE_RENDERER
 @BINPATH@/libEGL.dll
 @BINPATH@/libGLESv2.dll
 
 #ifdef MOZ_D3DCOMPILER_VISTA_DLL
 @BINPATH@/@MOZ_D3DCOMPILER_VISTA_DLL@
 #endif
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -147,19 +147,17 @@
     locale/browser/syncSetup.dtd                (%chrome/browser/syncSetup.dtd)
     locale/browser/syncSetup.properties         (%chrome/browser/syncSetup.properties)
     locale/browser/syncGenericChange.properties         (%chrome/browser/syncGenericChange.properties)
     locale/browser/syncKey.dtd                  (%chrome/browser/syncKey.dtd)
     locale/browser/syncQuota.dtd                (%chrome/browser/syncQuota.dtd)
     locale/browser/syncQuota.properties         (%chrome/browser/syncQuota.properties)
 #endif
 % resource search-plugins chrome://browser/locale/searchplugins/
-# little trick to make the test below work
-#define en_US en-US
-#if AB_CD == en_US
+#if BUILD_FASTER
     locale/browser/searchplugins/list.txt       (%searchplugins/list.txt)
     locale/browser/searchplugins/               (%searchplugins/*.xml)
 #else
     locale/browser/searchplugins/list.txt       (.deps/generated_@AB_CD@/list.txt)
     locale/browser/searchplugins/               (.deps/generated_@AB_CD@/*.xml)
 #endif
 % locale browser-region @AB_CD@ %locale/browser-region/
     locale/browser-region/region.properties        (%chrome/browser-region/region.properties)
--- a/browser/modules/BrowserUITelemetry.jsm
+++ b/browser/modules/BrowserUITelemetry.jsm
@@ -708,28 +708,34 @@ this.BrowserUITelemetry = {
   },
 
   _bucket: BUCKET_DEFAULT,
   _bucketTimer: null,
 
   /**
    * Default bucket name, when no other bucket is active.
    */
-  get BUCKET_DEFAULT() BUCKET_DEFAULT,
+  get BUCKET_DEFAULT() {
+    return BUCKET_DEFAULT;
+  },
 
   /**
    * Bucket prefix, for named buckets.
    */
-  get BUCKET_PREFIX() BUCKET_PREFIX,
+  get BUCKET_PREFIX() {
+    return BUCKET_PREFIX;
+  },
 
   /**
    * Standard separator to use between different parts of a bucket name, such
    * as primary name and the time step string.
    */
-  get BUCKET_SEPARATOR() BUCKET_SEPARATOR,
+  get BUCKET_SEPARATOR() {
+    return BUCKET_SEPARATOR;
+  },
 
   get currentBucket() {
     return this._bucket;
   },
 
   /**
    * Sets a named bucket for all countable events and select durections to be
    * put into.
--- a/browser/modules/ContentLinkHandler.jsm
+++ b/browser/modules/ContentLinkHandler.jsm
@@ -139,17 +139,17 @@ this.ContentLinkHandler = {
     // Verify that the load of this icon is legal.
     // Some error or special pages can load their favicon.
     // To be on the safe side, only allow chrome:// favicons.
     var isAllowedPage = [
       /^about:neterror\?/,
       /^about:blocked\?/,
       /^about:certerror\?/,
       /^about:home$/,
-    ].some(function (re) re.test(targetDoc.documentURI));
+    ].some(re => re.test(targetDoc.documentURI));
 
     if (!isAllowedPage || !uri.schemeIs("chrome")) {
       var ssm = Services.scriptSecurityManager;
       try {
         ssm.checkLoadURIWithPrincipal(targetDoc.nodePrincipal, uri,
                                       Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT);
       } catch(e) {
         return null;
--- a/browser/modules/DirectoryLinksProvider.jsm
+++ b/browser/modules/DirectoryLinksProvider.jsm
@@ -154,22 +154,24 @@ var DirectoryLinksProvider = {
   _avoidInadjacentSites: false,
 
   /**
    * This flag is set if _avoidInadjacentSites is true and there is
    * an inadjacent site in the new tab
    */
   _newTabHasInadjacentSite: false,
 
-  get _observedPrefs() Object.freeze({
-    enhanced: PREF_NEWTAB_ENHANCED,
-    linksURL: PREF_DIRECTORY_SOURCE,
-    matchOSLocale: PREF_MATCH_OS_LOCALE,
-    prefSelectedLocale: PREF_SELECTED_LOCALE,
-  }),
+  get _observedPrefs() {
+    return Object.freeze({
+      enhanced: PREF_NEWTAB_ENHANCED,
+      linksURL: PREF_DIRECTORY_SOURCE,
+      matchOSLocale: PREF_MATCH_OS_LOCALE,
+      prefSelectedLocale: PREF_SELECTED_LOCALE,
+    });
+  },
 
   get _linksURL() {
     if (!this.__linksURL) {
       try {
         this.__linksURL = Services.prefs.getCharPref(this._observedPrefs["linksURL"]);
         this.__linksURLModified = Services.prefs.prefHasUserValue(this._observedPrefs["linksURL"]);
       }
       catch (e) {
--- a/browser/modules/Social.jsm
+++ b/browser/modules/Social.jsm
@@ -208,17 +208,17 @@ this.Social = {
       let place = {
         uri: aURI,
         visits: [{
           visitDate: Date.now() + 1000,
           transitionType: Ci.nsINavHistoryService.TRANSITION_LINK
         }]
       };
       PlacesUtils.asyncHistory.updatePlaces(place, {
-        handleError: function () Cu.reportError("couldn't update history for socialmark annotation"),
+        handleError: () => Cu.reportError("couldn't update history for socialmark annotation"),
         handleResult: function () {},
         handleCompletion: function () {
           promiseSetAnnotation(aURI, providerList).then(function() {
             if (aCallback)
               schedule(function() { aCallback(true); } );
           }).then(null, Cu.reportError);
         }
       });
--- a/browser/modules/Windows8WindowFrameColor.jsm
+++ b/browser/modules/Windows8WindowFrameColor.jsm
@@ -26,17 +26,17 @@ const Windows8WindowFrameColor = {
       // Seems to be the default color (hardcoded because of bug 1065998)
       return [158, 158, 158];
     }
     // The color returned from the Registry is in decimal form.
     let customizationColorHex = customizationColor.toString(16);
     // Zero-pad the number just to make sure that it is 8 digits.
     customizationColorHex = ("00000000" + customizationColorHex).substr(-8);
     let customizationColorArray = customizationColorHex.match(/../g);
-    let [unused, fgR, fgG, fgB] = customizationColorArray.map(function(val) parseInt(val, 16));
+    let [unused, fgR, fgG, fgB] = customizationColorArray.map(val => parseInt(val, 16));
     let colorizationColorBalance = Registry.readRegKey(HKCU, dwmKey,
                                                        "ColorizationColorBalance") || 78;
      // Window frame base color when Color Intensity is at 0, see bug 1004576.
     let frameBaseColor = 217;
     let alpha = colorizationColorBalance / 100;
 
     // Alpha-blend the foreground color with the frame base color.
     let r = Math.round(fgR * alpha + frameBaseColor * (1 - alpha));
--- a/browser/modules/WindowsJumpLists.jsm
+++ b/browser/modules/WindowsJumpLists.jsm
@@ -97,41 +97,41 @@ var tasksCfg = [
    * args        - Command line args to invoke the task.
    * iconIndex   - Optional win icon index into the main application for the
    *               list item.
    * open        - Boolean indicates if the command should be visible after the browser opens.
    * close       - Boolean indicates if the command should be visible after the browser closes.
    */
   // Open new tab
   {
-    get title()       _getString("taskbar.tasks.newTab.label"),
-    get description() _getString("taskbar.tasks.newTab.description"),
+    get title()       { return _getString("taskbar.tasks.newTab.label"); },
+    get description() { return _getString("taskbar.tasks.newTab.description"); },
     args:             "-new-tab about:blank",
     iconIndex:        3, // New window icon
     open:             true,
     close:            true, // The jump list already has an app launch icon, but
                             // we don't always update the list on shutdown.
                             // Thus true for consistency.
   },
 
   // Open new window
   {
-    get title()       _getString("taskbar.tasks.newWindow.label"),
-    get description() _getString("taskbar.tasks.newWindow.description"),
+    get title()       { return _getString("taskbar.tasks.newWindow.label"); },
+    get description() { return _getString("taskbar.tasks.newWindow.description"); },
     args:             "-browser",
     iconIndex:        2, // New tab icon
     open:             true,
     close:            true, // No point, but we don't always update the list on
                             // shutdown. Thus true for consistency.
   },
 
   // Open new private window
   {
-    get title()       _getString("taskbar.tasks.newPrivateWindow.label"),
-    get description() _getString("taskbar.tasks.newPrivateWindow.description"),
+    get title()       { return _getString("taskbar.tasks.newPrivateWindow.label"); },
+    get description() { return _getString("taskbar.tasks.newPrivateWindow.description"); },
     args:             "-private-window",
     iconIndex:        4, // Private browsing mode icon
     open:             true,
     close:            true, // No point, but we don't always update the list on
                             // shutdown. Thus true for consistency.
   },
 ];
 
--- a/browser/modules/WindowsPreviewPerTab.jsm
+++ b/browser/modules/WindowsPreviewPerTab.jsm
@@ -310,18 +310,17 @@ PreviewController.prototype = {
     // Avoid returning 0
     let tabWidth = boxObject.width || 1;
     // Avoid divide by 0
     let tabHeight = boxObject.height || 1;
     return tabWidth / tabHeight;
   },
 
   drawPreview: function (ctx) {
-    let self = this;
-    this.win.tabbrowser.previewTab(this.tab, function () self.previewTabCallback(ctx));
+    this.win.tabbrowser.previewTab(this.tab, () => this.previewTabCallback(ctx));
 
     // We must avoid having the frame drawn around the window. See bug 520807
     return false;
   },
 
   previewTabCallback: function (ctx) {
     // This will extract the resolution-scale component of the scaling we need,
     // which should be applied to both chrome and content;
@@ -744,17 +743,17 @@ this.AeroPeek = {
           let controller = preview.controller.wrappedJSObject;
           controller.resetCanvasPreview();
         });
         break;
     }
   }
 };
 
-XPCOMUtils.defineLazyGetter(AeroPeek, "cacheTimer", function ()
+XPCOMUtils.defineLazyGetter(AeroPeek, "cacheTimer", () =>
   Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer)
 );
 
 XPCOMUtils.defineLazyServiceGetter(AeroPeek, "prefs",
                                    "@mozilla.org/preferences-service;1",
                                    "nsIPrefBranch");
 
 AeroPeek.initialize();
--- a/browser/modules/test/browser_taskbar_preview.js
+++ b/browser/modules/test/browser_taskbar_preview.js
@@ -101,24 +101,27 @@ function test() {
 
   function checkPreviews(aPreviews, msg) {
     let nPreviews = AeroPeek.previews.length;
     is(aPreviews, gBrowser.tabs.length, "Browser has expected number of tabs");
     is(nPreviews, gBrowser.tabs.length, "Browser has one preview per tab");
     is(nPreviews, aPreviews, msg || "Got expected number of previews");
   }
 
-  function getPreviewForTab(tab)
-    window.gTaskbarTabGroup.previewFromTab(tab);
+  function getPreviewForTab(tab) {
+    return window.gTaskbarTabGroup.previewFromTab(tab);
+  }
 
-  function checkSelectedTab()
-    getPreviewForTab(gBrowser.selectedTab).active;
+  function checkSelectedTab() {
+    return getPreviewForTab(gBrowser.selectedTab).active;
+  }
 
-  function isTabSelected(idx)
-    gBrowser.tabs[idx].selected;
+  function isTabSelected(idx) {
+    return gBrowser.tabs[idx].selected;
+  }
 
   function createThumbnailSurface(p) {
     let thumbnailWidth = 200,
         thumbnailHeight = 120;
     let ratio = p.controller.thumbnailAspectRatio;
 
     if (thumbnailWidth/thumbnailHeight > ratio)
       thumbnailWidth = thumbnailHeight * ratio;
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -1632,21 +1632,29 @@ richlistitem[type~="action"][actiontype=
 }
 
 .alltabs-item[tabIsVisible] {
   /* box-shadow instead of background-color to work around native styling */
   box-shadow: inset -5px 0 ThreeDShadow;
 }
 
 .alltabs-endimage[muted] {
-  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-muted);
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-muted);
 }
 
 .alltabs-endimage[soundplaying] {
-  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio);
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu);
+}
+
+menuitem:hover > hbox > .alltabs-endimage[muted] {
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-muted-hover);
+}
+
+menuitem:hover > hbox > .alltabs-endimage[soundplaying] {
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-hover);
 }
 
 /* Sidebar */
 #sidebar-throbber[loading="true"] {
   list-style-image: url("chrome://global/skin/icons/loading_16.png");
   -moz-margin-end: 4px;
 }
 
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -2954,21 +2954,29 @@ toolbarbutton.chevron > .toolbarbutton-m
 }
 
 .alltabs-item[tabIsVisible] {
   /* box-shadow instead of background-color to work around native styling */
   box-shadow: inset -5px 0 ThreeDShadow;
 }
 
 .alltabs-endimage[muted] {
-  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-muted);
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-muted);
 }
 
 .alltabs-endimage[soundplaying] {
-  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio);
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu);
+}
+
+menuitem:hover > hbox > .alltabs-endimage[muted] {
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-muted-hover);
+}
+
+menuitem:hover > hbox > .alltabs-endimage[soundplaying] {
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-hover);
 }
 
 /* Bookmarks toolbar */
 #PlacesToolbarDropIndicator {
   list-style-image: url(chrome://browser/skin/places/toolbarDropMarker.png);
 }
 
 /* Bookmark drag and drop styles */
--- a/browser/themes/shared/controlcenter/panel.inc.css
+++ b/browser/themes/shared/controlcenter/panel.inc.css
@@ -284,20 +284,25 @@ description#identity-popup-content-verif
 }
 
 /* PERMISSIONS */
 
 #identity-popup-permissions-content {
   background-image: url(chrome://browser/skin/controlcenter/permissions.svg);
 }
 
+#identity-popup-permission-list menulist {
+  min-width: 60px;
+}
+
 #identity-popup-permission-list:not(:empty) {
   margin-top: 5px;
 }
 
 #identity-popup-permission-list:not(:empty) + description {
   display: none;
 }
 
 .identity-popup-permission-label {
   -moz-margin-start: 0;
+  word-wrap: break-word;
 }
 
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -94,17 +94,17 @@
   skin/classic/browser/search-history-icon.svg                 (../shared/search/history-icon.svg)
   skin/classic/browser/search-indicator-magnifying-glass.svg   (../shared/search/search-indicator-magnifying-glass.svg)
   skin/classic/browser/search-arrow-go.svg                     (../shared/search/search-arrow-go.svg)
   skin/classic/browser/social/chat-icons.svg                   (../shared/social/chat-icons.svg)
   skin/classic/browser/social/gear_default.png                 (../shared/social/gear_default.png)
   skin/classic/browser/social/gear_clicked.png                 (../shared/social/gear_clicked.png)
   skin/classic/browser/tabbrowser/crashed.svg                  (../shared/tabbrowser/crashed.svg)
   skin/classic/browser/tabbrowser/pendingpaint.png             (../shared/tabbrowser/pendingpaint.png)
-  skin/classic/browser/tabbrowser/tab-audio.svg                (../shared/tabbrowser/tab-audio.svg)
+* skin/classic/browser/tabbrowser/tab-audio.svg                (../shared/tabbrowser/tab-audio.svg)
   skin/classic/browser/tabbrowser/tab-audio-small.svg          (../shared/tabbrowser/tab-audio-small.svg)
   skin/classic/browser/tabbrowser/tab-overflow-indicator.png   (../shared/tabbrowser/tab-overflow-indicator.png)
   skin/classic/browser/theme-switcher-icon.png                 (../shared/theme-switcher-icon.png)
   skin/classic/browser/theme-switcher-icon@2x.png              (../shared/theme-switcher-icon@2x.png)
   skin/classic/browser/translating-16.png                      (../shared/translation/translating-16.png)
   skin/classic/browser/translating-16@2x.png                   (../shared/translation/translating-16@2x.png)
   skin/classic/browser/translation-16.png                      (../shared/translation/translation-16.png)
   skin/classic/browser/translation-16@2x.png                   (../shared/translation/translation-16@2x.png)
--- a/browser/themes/shared/tabbrowser/tab-audio.svg
+++ b/browser/themes/shared/tabbrowser/tab-audio.svg
@@ -30,16 +30,27 @@
     .icon.white.pressed {
       opacity: 1;
     }
     .icon.white > .outline {
       fill: #000;
       fill-opacity: .5;
     }
 
+    .icon.menu {
+      fill: MenuText;
+    }
+    .icon.menu.hover {
+#ifdef XP_MACOSX
+      fill: -moz-mac-menutextselect;
+#else
+      fill: -moz-menuhovertext;
+#endif
+    }
+
     .icon.backgroundTab,
     .icon.backgroundTab.hover,
     .icon.backgroundTab.pressed {
       fill: -moz-MenuBarText;
     }
   </style>
 
   <path id="tab-audio" class="icon" d="M4,5C2.9,5,2,5.9,2,7v2c0,1.1,0.9,2,2,2h1.2L9,14V2L5.2,5H4z M11,8c0-0.6-0.4-1-1-1v2C10.6,9,11,8.6,11,8z M13,8 c0-1.4-1-2.6-2.3-2.9L10.4,6C11.3,6.2,12,7,12,8s-0.7,1.8-1.6,2l0.4,0.9C12,10.6,13,9.4,13,8z M11.4,3.2l-0.4,0.9 C12.8,4.6,14,6.2,14,8s-1.2,3.4-2.9,3.8l0.4,0.9C13.5,12.2,15,10.3,15,8S13.5,3.8,11.4,3.2z"/>
@@ -79,9 +90,14 @@
     <path class="outline" d="M9,2v4.3l3.5-2.9l0.9,1.2l-11,9l-1-1.2l1.9-1.5C2.6,10.6,2,9.9,2,9V7c0-1.1,0.9-2,2-2h1.2L9,2 M9,10v4l-2.5-2L9,10 M10-0.1 L8.4,1.2L4.9,4H4C2.3,4,1,5.3,1,7v2c0,0.7,0.3,1.4,0.7,2l-0.8,0.7l-0.8,0.6l0.6,0.8l1,1.2L2.3,15l0.8-0.6l2.3-1.9l0.4,0.3l2.5,2 l1.6,1.3V14v-4V8.7l4.1-3.4l0.8-0.6l-0.6-0.8l-0.9-1.2L12.7,2l-0.8,0.6L10,4.2V2V-0.1L10-0.1z"/>
     <path d="M12.5,3.4L9,6.3V2L5.2,5H4C2.9,5,2,5.9,2,7v2c0,0.9,0.6,1.6,1.4,1.9l-1.9,1.5l1,1.2l11-9L12.5,3.4z M9,14v-4l-2.5,2L9,14z"/>
   </g>
   <g id="tab-audio-muted-white-pressed" class="icon muted white pressed">
     <path class="outline" d="M9,2v4.3l3.5-2.9l0.9,1.2l-11,9l-1-1.2l1.9-1.5C2.6,10.6,2,9.9,2,9V7c0-1.1,0.9-2,2-2h1.2L9,2 M9,10v4l-2.5-2L9,10 M10-0.1 L8.4,1.2L4.9,4H4C2.3,4,1,5.3,1,7v2c0,0.7,0.3,1.4,0.7,2l-0.8,0.7l-0.8,0.6l0.6,0.8l1,1.2L2.3,15l0.8-0.6l2.3-1.9l0.4,0.3l2.5,2 l1.6,1.3V14v-4V8.7l4.1-3.4l0.8-0.6l-0.6-0.8l-0.9-1.2L12.7,2l-0.8,0.6L10,4.2V2V-0.1L10-0.1z"/>
     <path d="M12.5,3.4L9,6.3V2L5.2,5H4C2.9,5,2,5.9,2,7v2c0,0.9,0.6,1.6,1.4,1.9l-1.9,1.5l1,1.2l11-9L12.5,3.4z M9,14v-4l-2.5,2L9,14z"/>
   </g>
 
+  <path id="tab-audio-menu" class="icon menu" d="M4,5C2.9,5,2,5.9,2,7v2c0,1.1,0.9,2,2,2h1.2L9,14V2L5.2,5H4z M11,8c0-0.6-0.4-1-1-1v2C10.6,9,11,8.6,11,8z M13,8 c0-1.4-1-2.6-2.3-2.9L10.4,6C11.3,6.2,12,7,12,8s-0.7,1.8-1.6,2l0.4,0.9C12,10.6,13,9.4,13,8z M11.4,3.2l-0.4,0.9 C12.8,4.6,14,6.2,14,8s-1.2,3.4-2.9,3.8l0.4,0.9C13.5,12.2,15,10.3,15,8S13.5,3.8,11.4,3.2z"/>
+  <path id="tab-audio-menu-muted" class="icon menu" d="M12.5,3.4L9,6.3V2L5.2,5H4C2.9,5,2,5.9,2,7v2c0,0.9,0.6,1.6,1.4,1.9l-1.9,1.5l1,1.2l11-9L12.5,3.4z M9,14v-4l-2.5,2L9,14z"/>
+  <path id="tab-audio-menu-hover" class="icon menu hover" d="M4,5C2.9,5,2,5.9,2,7v2c0,1.1,0.9,2,2,2h1.2L9,14V2L5.2,5H4z M11,8c0-0.6-0.4-1-1-1v2C10.6,9,11,8.6,11,8z M13,8 c0-1.4-1-2.6-2.3-2.9L10.4,6C11.3,6.2,12,7,12,8s-0.7,1.8-1.6,2l0.4,0.9C12,10.6,13,9.4,13,8z M11.4,3.2l-0.4,0.9 C12.8,4.6,14,6.2,14,8s-1.2,3.4-2.9,3.8l0.4,0.9C13.5,12.2,15,10.3,15,8S13.5,3.8,11.4,3.2z"/>
+  <path id="tab-audio-menu-muted-hover" class="icon menu hover" d="M12.5,3.4L9,6.3V2L5.2,5H4C2.9,5,2,5.9,2,7v2c0,0.9,0.6,1.6,1.4,1.9l-1.9,1.5l1,1.2l11-9L12.5,3.4z M9,14v-4l-2.5,2L9,14z"/>
+
 </svg>
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -2190,21 +2190,29 @@ richlistitem[type~="action"][actiontype=
 }
 
 .alltabs-item[tabIsVisible] {
   /* box-shadow instead of background-color to work around native styling */
   box-shadow: inset -5px 0 ThreeDShadow;
 }
 
 .alltabs-endimage[muted] {
-  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-muted);
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-muted);
 }
 
 .alltabs-endimage[soundplaying] {
-  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio);
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu);
+}
+
+menuitem:hover > hbox > .alltabs-endimage[muted] {
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-muted-hover);
+}
+
+menuitem:hover > hbox > .alltabs-endimage[soundplaying] {
+  list-style-image: url(chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-menu-hover);
 }
 
 toolbarbutton.chevron {
   list-style-image: url("chrome://global/skin/toolbar/chevron.gif") !important;
 }
 
 toolbar[brighttext] toolbarbutton.chevron {
   list-style-image: url("chrome://global/skin/toolbar/chevron-inverted.png") !important;
--- a/build/autoconf/compiler-opts.m4
+++ b/build/autoconf/compiler-opts.m4
@@ -132,33 +132,37 @@ MOZ_DEBUG_ENABLE_DEFS="-DDEBUG -DTRACING
 MOZ_ARG_WITH_STRING(debug-label,
 [  --with-debug-label=LABELS
                           Define DEBUG_<value> for each comma-separated
                           value given.],
 [ for option in `echo $withval | sed 's/,/ /g'`; do
     MOZ_DEBUG_ENABLE_DEFS="$MOZ_DEBUG_ENABLE_DEFS -DDEBUG_${option}"
 done])
 
-MOZ_DEBUG_DISABLE_DEFS="-DNDEBUG -DTRIMMED"
-
 if test -n "$MOZ_DEBUG"; then
     AC_MSG_CHECKING([for valid debug flags])
     _SAVE_CFLAGS=$CFLAGS
     CFLAGS="$CFLAGS $MOZ_DEBUG_FLAGS"
     AC_TRY_COMPILE([#include <stdio.h>],
         [printf("Hello World\n");],
         _results=yes,
         _results=no)
     AC_MSG_RESULT([$_results])
     if test "$_results" = "no"; then
         AC_MSG_ERROR([These compiler flags are invalid: $MOZ_DEBUG_FLAGS])
     fi
     CFLAGS=$_SAVE_CFLAGS
+
+    MOZ_DEBUG_DEFINES="$MOZ_DEBUG_ENABLE_DEFS"
+else
+    MOZ_DEBUG_DEFINES="-DNDEBUG -DTRIMMED"
 fi
 
+AC_SUBST(MOZ_DEBUG_DEFINES)
+
 dnl ========================================================
 dnl = Enable generation of debug symbols
 dnl ========================================================
 MOZ_ARG_ENABLE_STRING(debug-symbols,
 [  --enable-debug-symbols[=DBG]
                           Enable debugging symbols (using compiler flags DBG)],
 [ if test "$enableval" != "no"; then
       MOZ_DEBUG_SYMBOLS=1
--- a/build/macosx/cross-mozconfig.common
+++ b/build/macosx/cross-mozconfig.common
@@ -41,11 +41,14 @@ export DMG_TOOL=$topsrcdir/dmg/dmg
 export HOST_CC="$topsrcdir/clang/bin/clang"
 export HOST_CXX="$topsrcdir/clang/bin/clang++"
 export HOST_CPP="$topsrcdir/clang/bin/clang -E"
 export HOST_LDFLAGS="-g"
 
 ac_add_options --target=x86_64-apple-darwin
 ac_add_options --with-macos-private-frameworks=$CROSS_PRIVATE_FRAMEWORKS
 
+# Enable static analysis checks by default on OSX cross builds.
+ac_add_options --enable-clang-plugin
+
 . "$topsrcdir/build/mozconfig.cache"
 
 export SOCORRO_SYMBOL_UPLOAD_TOKEN_FILE=/builds/crash-stats-api.token
--- a/caps/BasePrincipal.cpp
+++ b/caps/BasePrincipal.cpp
@@ -48,18 +48,16 @@ bool OriginAttributes::CopyFromLoadConte
   mUserContextId = attrs.mUserContextId;
   mSignedPkg = attrs.mSignedPkg;
   return true;
 }
 
 void
 OriginAttributes::CreateSuffix(nsACString& aStr) const
 {
-  MOZ_RELEASE_ASSERT(mAppId != nsIScriptSecurityManager::UNKNOWN_APP_ID);
-
   UniquePtr<URLParams> params(new URLParams());
   nsAutoString value;
 
   //
   // Important: While serializing any string-valued attributes, perform a
   // release-mode assertion to make sure that they don't contain characters that
   // will break the quota manager when it uses the serialization for file
   // naming (see addonId below).
@@ -122,20 +120,16 @@ public:
   {
     if (aName.EqualsLiteral("appId")) {
       nsresult rv;
       mOriginAttributes->mAppId = aValue.ToInteger(&rv);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return false;
       }
 
-      if (mOriginAttributes->mAppId == nsIScriptSecurityManager::UNKNOWN_APP_ID) {
-        return false;
-      }
-
       return true;
     }
 
     if (aName.EqualsLiteral("inBrowser")) {
       if (!aValue.EqualsLiteral("1")) {
         return false;
       }
 
@@ -217,24 +211,16 @@ BasePrincipal::~BasePrincipal()
 {}
 
 NS_IMETHODIMP
 BasePrincipal::GetOrigin(nsACString& aOrigin)
 {
   nsresult rv = GetOriginInternal(aOrigin);
   NS_ENSURE_SUCCESS(rv, rv);
 
-  // OriginAttributes::CreateSuffix asserts against UNKNOWN_APP_ID. It's trivial
-  // to trigger this getter from script on such a principal, so we handle it
-  // here at the API entry point.
-  if (mOriginAttributes.mAppId == nsIScriptSecurityManager::UNKNOWN_APP_ID) {
-    NS_WARNING("Refusing to provide canonical origin string to principal with UNKNOWN_APP_ID");
-    return NS_ERROR_FAILURE;
-  }
-
   nsAutoCString suffix;
   mOriginAttributes.CreateSuffix(suffix);
   aOrigin.Append(suffix);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BasePrincipal::GetOriginNoSuffix(nsACString& aOrigin)
@@ -320,18 +306,16 @@ BasePrincipal::GetIsNullPrincipal(bool* 
 {
   *aIsNullPrincipal = false;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BasePrincipal::GetJarPrefix(nsACString& aJarPrefix)
 {
-  MOZ_ASSERT(AppId() != nsIScriptSecurityManager::UNKNOWN_APP_ID);
-
   mozilla::GetJarPrefix(mOriginAttributes.mAppId, mOriginAttributes.mInBrowser, aJarPrefix);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BasePrincipal::GetOriginAttributes(JSContext* aCx, JS::MutableHandle<JS::Value> aVal)
 {
   if (NS_WARN_IF(!ToJSValue(aCx, mOriginAttributes, aVal))) {
@@ -421,16 +405,38 @@ BasePrincipal::CreateCodebasePrincipal(n
 
   // Mint a codebase principal.
   nsRefPtr<nsPrincipal> codebase = new nsPrincipal();
   rv = codebase->Init(aURI, aAttrs);
   NS_ENSURE_SUCCESS(rv, nullptr);
   return codebase.forget();
 }
 
+already_AddRefed<BasePrincipal>
+BasePrincipal::CreateCodebasePrincipal(const nsACString& aOrigin)
+{
+  MOZ_ASSERT(!StringBeginsWith(aOrigin, NS_LITERAL_CSTRING("[")),
+             "CreateCodebasePrincipal does not support System and Expanded principals");
+
+  MOZ_ASSERT(!StringBeginsWith(aOrigin, NS_LITERAL_CSTRING(NS_NULLPRINCIPAL_SCHEME ":")),
+             "CreateCodebasePrincipal does not support nsNullPrincipal");
+
+  nsAutoCString originNoSuffix;
+  mozilla::OriginAttributes attrs;
+  if (!attrs.PopulateFromOrigin(aOrigin, originNoSuffix)) {
+    return nullptr;
+  }
+
+  nsCOMPtr<nsIURI> uri;
+  nsresult rv = NS_NewURI(getter_AddRefs(uri), originNoSuffix);
+  NS_ENSURE_SUCCESS(rv, nullptr);
+
+  return BasePrincipal::CreateCodebasePrincipal(uri, attrs);
+}
+
 bool
 BasePrincipal::AddonAllowsLoad(nsIURI* aURI)
 {
   if (mOriginAttributes.mAddonId.IsEmpty()) {
     return false;
   }
 
   nsCOMPtr<nsIAddonPolicyService> aps = do_GetService("@mozilla.org/addons/policy-service;1");
--- a/caps/BasePrincipal.h
+++ b/caps/BasePrincipal.h
@@ -155,16 +155,17 @@ public:
   NS_IMETHOD GetUserContextId(uint32_t* aUserContextId) final;
 
   virtual bool IsOnCSSUnprefixingWhitelist() override { return false; }
 
   virtual bool IsCodebasePrincipal() const { return false; };
 
   static BasePrincipal* Cast(nsIPrincipal* aPrin) { return static_cast<BasePrincipal*>(aPrin); }
   static already_AddRefed<BasePrincipal> CreateCodebasePrincipal(nsIURI* aURI, OriginAttributes& aAttrs);
+  static already_AddRefed<BasePrincipal> CreateCodebasePrincipal(const nsACString& aOrigin);
 
   const OriginAttributes& OriginAttributesRef() { return mOriginAttributes; }
   uint32_t AppId() const { return mOriginAttributes.mAppId; }
   uint32_t UserContextId() const { return mOriginAttributes.mUserContextId; }
   bool IsInBrowserElement() const { return mOriginAttributes.mInBrowser; }
 
 protected:
   virtual ~BasePrincipal();
--- a/caps/nsIScriptSecurityManager.idl
+++ b/caps/nsIScriptSecurityManager.idl
@@ -21,17 +21,17 @@ class DomainPolicyClone;
 }
 }
 %}
 
 [ptr] native JSContextPtr(JSContext);
 [ptr] native JSObjectPtr(JSObject);
 [ptr] native DomainPolicyClonePtr(mozilla::dom::DomainPolicyClone);
 
-[scriptable, uuid(6e8a4d1e-d9c6-4d86-bf53-d73f58f36148)]
+[scriptable, uuid(b7ae2310-576e-11e5-a837-0800200c9a66)]
 interface nsIScriptSecurityManager : nsISupports
 {
     /**
      * For each of these hooks returning NS_OK means 'let the action continue'.
      * Returning an error code means 'veto the action'. XPConnect will return
      * false to the js engine if the action is vetoed. The implementor of this
      * interface is responsible for setting a JS exception into the JSContext
      * if that is appropriate.
@@ -193,16 +193,23 @@ interface nsIScriptSecurityManager : nsI
      * Returns a principal whose origin is composed of |uri| and |originAttributes|.
      * See nsIPrincipal.idl for a description of origin attributes, and
      * ChromeUtils.webidl for a list of origin attributes and their defaults.
      */
     [implicit_jscontext]
     nsIPrincipal createCodebasePrincipal(in nsIURI uri, in jsval originAttributes);
 
     /**
+     * Returns a principal whose origin is the one we pass in.
+     * See nsIPrincipal.idl for a description of origin attributes, and
+     * ChromeUtils.webidl for a list of origin attributes and their defaults.
+     */
+    nsIPrincipal createCodebasePrincipalFromOrigin(in ACString origin);
+
+    /**
      * Returns a unique nonce principal with |originAttributes|.
      * See nsIPrincipal.idl for a description of origin attributes, and
      * ChromeUtils.webidl for a list of origin attributes and their defaults.
      */
     [implicit_jscontext]
     nsIPrincipal createNullPrincipal(in jsval originAttributes);
 
     /**
--- a/caps/nsNullPrincipal.cpp
+++ b/caps/nsNullPrincipal.cpp
@@ -52,17 +52,16 @@ nsNullPrincipal::Create(const OriginAttr
 
   return nullPrin.forget();
 }
 
 nsresult
 nsNullPrincipal::Init(const OriginAttributes& aOriginAttributes)
 {
   mOriginAttributes = aOriginAttributes;
-  MOZ_ASSERT(AppId() != nsIScriptSecurityManager::UNKNOWN_APP_ID);
 
   mURI = nsNullPrincipalURI::Create();
   NS_ENSURE_TRUE(mURI, NS_ERROR_NOT_AVAILABLE);
 
   return NS_OK;
 }
 
 void
@@ -168,19 +167,16 @@ nsNullPrincipal::Read(nsIObjectInputStre
   NS_ENSURE_TRUE(ok, NS_ERROR_FAILURE);
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsNullPrincipal::Write(nsIObjectOutputStream* aStream)
 {
-  NS_ENSURE_TRUE(mOriginAttributes.mAppId != nsIScriptSecurityManager::UNKNOWN_APP_ID,
-                 NS_ERROR_INVALID_ARG);
-
   nsAutoCString suffix;
   OriginAttributesRef().CreateSuffix(suffix);
 
   nsresult rv = aStream->WriteStringZ(suffix.get());
   NS_ENSURE_SUCCESS(rv, rv);
 
   return NS_OK;
 }
--- a/caps/nsPrincipal.cpp
+++ b/caps/nsPrincipal.cpp
@@ -422,19 +422,16 @@ nsPrincipal::Read(nsIObjectInputStream* 
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsPrincipal::Write(nsIObjectOutputStream* aStream)
 {
   NS_ENSURE_STATE(mCodebase);
-  NS_ENSURE_TRUE(mOriginAttributes.mAppId != nsIScriptSecurityManager::UNKNOWN_APP_ID,
-                 NS_ERROR_INVALID_ARG);
-
   nsresult rv = NS_WriteOptionalCompoundObject(aStream, mCodebase, NS_GET_IID(nsIURI),
                                                true);
   if (NS_FAILED(rv)) {
     return rv;
   }
 
   rv = NS_WriteOptionalCompoundObject(aStream, mDomain, NS_GET_IID(nsIURI),
                                       true);
--- a/caps/nsScriptSecurityManager.cpp
+++ b/caps/nsScriptSecurityManager.cpp
@@ -62,16 +62,17 @@
 #include "mozilla/dom/BindingUtils.h"
 #include <stdint.h>
 #include "mozilla/dom/ScriptSettings.h"
 #include "mozilla/ClearOnShutdown.h"
 #include "mozilla/StaticPtr.h"
 #include "nsContentUtils.h"
 #include "nsJSUtils.h"
 #include "nsILoadInfo.h"
+#include "nsXPCOMStrings.h"
 
 // This should be probably defined on some other place... but I couldn't find it
 #define WEBAPPS_PERM_NAME "webapps-manage"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 nsIIOService    *nsScriptSecurityManager::sIOService = nullptr;
@@ -1039,16 +1040,33 @@ nsScriptSecurityManager::CreateCodebaseP
       return NS_ERROR_INVALID_ARG;
   }
   nsCOMPtr<nsIPrincipal> prin = BasePrincipal::CreateCodebasePrincipal(aURI, attrs);
   prin.forget(aPrincipal);
   return *aPrincipal ? NS_OK : NS_ERROR_FAILURE;
 }
 
 NS_IMETHODIMP
+nsScriptSecurityManager::CreateCodebasePrincipalFromOrigin(const nsACString& aOrigin,
+                                                           nsIPrincipal** aPrincipal)
+{
+  if (StringBeginsWith(aOrigin, NS_LITERAL_CSTRING("["))) {
+    return NS_ERROR_INVALID_ARG;
+  }
+
+  if (StringBeginsWith(aOrigin, NS_LITERAL_CSTRING(NS_NULLPRINCIPAL_SCHEME ":"))) {
+    return NS_ERROR_INVALID_ARG;
+  }
+
+  nsCOMPtr<nsIPrincipal> prin = BasePrincipal::CreateCodebasePrincipal(aOrigin);
+  prin.forget(aPrincipal);
+  return *aPrincipal ? NS_OK : NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
 nsScriptSecurityManager::CreateNullPrincipal(JS::Handle<JS::Value> aOriginAttributes,
                                              JSContext* aCx, nsIPrincipal** aPrincipal)
 {
   OriginAttributes attrs;
   if (!aOriginAttributes.isObject() || !attrs.Init(aCx, aOriginAttributes)) {
       return NS_ERROR_INVALID_ARG;
   }
   nsCOMPtr<nsIPrincipal> prin = nsNullPrincipal::Create(attrs);
--- a/caps/tests/unit/test_origin.js
+++ b/caps/tests/unit/test_origin.js
@@ -1,14 +1,13 @@
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cu = Components.utils;
 
 Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/BrowserUtils.jsm");
 var ssm = Services.scriptSecurityManager;
 function makeURI(uri) { return Services.io.newURI(uri, null, null); }
 
 function checkThrows(f) {
   var threw = false;
   try { f(); } catch (e) { threw = true }
   do_check_true(threw);
 }
@@ -23,19 +22,19 @@ function checkCrossOrigin(a, b) {
 }
 
 function checkOriginAttributes(prin, attrs, suffix) {
   attrs = attrs || {};
   do_check_eq(prin.originAttributes.appId, attrs.appId || 0);
   do_check_eq(prin.originAttributes.inBrowser, attrs.inBrowser || false);
   do_check_eq(prin.originSuffix, suffix || '');
   if (!prin.isNullPrincipal && !prin.origin.startsWith('[')) {
-    do_check_true(BrowserUtils.principalFromOrigin(prin.origin).equals(prin));
+    do_check_true(ssm.createCodebasePrincipalFromOrigin(prin.origin).equals(prin));
   } else {
-    checkThrows(() => BrowserUtils.principalFromOrigin(prin.origin));
+    checkThrows(() => ssm.createCodebasePrincipalFromOrigin(prin.origin));
   }
 }
 
 function run_test() {
   // Attributeless origins.
   do_check_eq(ssm.getSystemPrincipal().origin, '[System Principal]');
   checkOriginAttributes(ssm.getSystemPrincipal());
   var exampleOrg = ssm.createCodebasePrincipal(makeURI('http://example.org'), {});
@@ -94,21 +93,17 @@ function run_test() {
   checkOriginAttributes(exampleCom_appBrowser, {appId: 42, inBrowser: true}, '^appId=42&inBrowser=1');
   do_check_eq(exampleCom_appBrowser.origin, 'https://www.example.com:123^appId=42&inBrowser=1');
 
   // Addon.
   var exampleOrg_addon = ssm.createCodebasePrincipal(makeURI('http://example.org'), {addonId: 'dummy'});
   checkOriginAttributes(exampleOrg_addon, { addonId: "dummy" }, '^addonId=dummy');
   do_check_eq(exampleOrg_addon.origin, 'http://example.org^addonId=dummy');
 
-  // Make sure that we refuse to create .origin for principals with UNKNOWN_APP_ID.
-  var simplePrin = ssm.getSimpleCodebasePrincipal(makeURI('http://example.com'));
-  try { simplePrin.origin; do_check_true(false); } catch (e) { do_check_true(true); }
-
-  // Make sure we don't crash when serializing them either.
+  // Make sure we don't crash when serializing principals with UNKNOWN_APP_ID.
   try {
     let binaryStream = Cc["@mozilla.org/binaryoutputstream;1"].
                        createInstance(Ci.nsIObjectOutputStream);
     let pipe = Cc["@mozilla.org/pipe;1"].createInstance(Ci.nsIPipe);
     pipe.init(false, false, 0, 0xffffffff, null);
     binaryStream.setOutputStream(pipe.outputStream);
     binaryStream.writeCompoundObject(simplePrin, Ci.nsISupports, true);
     binaryStream.close();
--- a/chrome/test/unit/test_no_remote_registration.js
+++ b/chrome/test/unit/test_no_remote_registration.js
@@ -46,17 +46,17 @@ function ProtocolHandler(aScheme, aFlags
   this.scheme = aScheme;
   this.protocolFlags = aFlags;
   this.contractID = "@mozilla.org/network/protocol;1?name=" + aScheme;
 }
 
 ProtocolHandler.prototype =
 {
   defaultPort: -1,
-  allowPort: function() false,
+  allowPort: () => false,
   newURI: function(aSpec, aCharset, aBaseURI)
   {
     let uri = Cc["@mozilla.org/network/standard-url;1"].
               createInstance(Ci.nsIURI);
     uri.spec = aSpec;
     if (!uri.scheme) {
       // We got a partial uri, so let's resolve it with the base one
       uri.spec = aBaseURI.resolve(aSpec);
--- a/config/config.mk
+++ b/config/config.mk
@@ -157,23 +157,17 @@ TOUCH ?= touch
 
 PYTHON_PATH = $(PYTHON) $(topsrcdir)/config/pythonpath.py
 
 # determine debug-related options
 _DEBUG_ASFLAGS :=
 _DEBUG_CFLAGS :=
 _DEBUG_LDFLAGS :=
 
-ifdef MOZ_DEBUG
-  _DEBUG_CFLAGS += $(MOZ_DEBUG_ENABLE_DEFS)
-  XULPPFLAGS += $(MOZ_DEBUG_ENABLE_DEFS)
-else
-  _DEBUG_CFLAGS += $(MOZ_DEBUG_DISABLE_DEFS)
-  XULPPFLAGS += $(MOZ_DEBUG_DISABLE_DEFS)
-endif
+_DEBUG_CFLAGS += $(MOZ_DEBUG_DEFINES)
 
 ifneq (,$(MOZ_DEBUG)$(MOZ_DEBUG_SYMBOLS))
   ifeq ($(AS),yasm)
     ifeq ($(OS_ARCH)_$(GNU_CC),WINNT_)
       _DEBUG_ASFLAGS += -g cv8
     else
       ifneq ($(OS_ARCH),Darwin)
         _DEBUG_ASFLAGS += -g dwarf2
--- a/config/external/nss/Makefile.in
+++ b/config/external/nss/Makefile.in
@@ -349,17 +349,17 @@ nss3.def: $(nss_def_file) $(DEPTH)/db/sq
 	mv $@.tmp $@
 else
 ifdef GCC_USE_GNU_LD
 sqlite_def_file := $(topsrcdir)/db/sqlite3/src/sqlite.def
 nspr_def_file := $(srcdir)/nspr-dummy.def
 
 nss3.def: $(nss_def_file) $(sqlite_def_file) $(nspr_def_file) $(NSS_EXTRA_SYMBOLS_FILE)
 	@$(call py_action,convert_def_file, \
-	  $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) -o $@ $^)
+	  $(DEFINES) $(ACDEFINES) $(MOZ_DEBUG_DEFINES) -o $@ $^)
 
 GARBAGE += \
   nss3.def \
   $(NULL)
 endif # GCC_USE_GNU_LD
 endif # WINNT
 
 IMPORT_LIB_FILES = $(IMPORT_LIBRARY)
--- a/config/external/sqlite/Makefile.in
+++ b/config/external/sqlite/Makefile.in
@@ -16,13 +16,13 @@ ifdef GCC_USE_GNU_LD
 
 GARBAGE += \
   $(LD_VERSION_SCRIPT) \
   $(NULL)
 
 # Convert to the format we need for ld.
 $(LD_VERSION_SCRIPT): $(topsrcdir)/db/sqlite3/src/sqlite.def
 	@$(call py_action,convert_def_file, \
-	  $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) -o $@ $^)
+	  $(DEFINES) $(ACDEFINES) $(MOZ_DEBUG_DEFINES) -o $@ $^)
 
 endif
 endif
 endif
--- a/config/faster/rules.mk
+++ b/config/faster/rules.mk
@@ -54,18 +54,18 @@ default: $(TOPOBJDIR)/dist/bin/platform.
 default: $(TOPOBJDIR)/dist/bin/webapprt/webapprt.ini
 
 # Targets from the recursive make backend to be built for a default build
 default: $(TOPOBJDIR)/config/makefiles/xpidl/xpidl
 
 .PHONY: FORCE
 
 # Extra define to trigger some workarounds. We should strive to limit the
-# use of those. As of writing the only one is in
-# toolkit/content/buildconfig.html.
+# use of those. As of writing the only ones are in
+# toolkit/content/buildconfig.html and browser/locales/jar.mn.
 ACDEFINES += -DBUILD_FASTER
 
 # Generic rule to fall back to the recursive make backend
 $(TOPOBJDIR)/%: FORCE
 	$(MAKE) -C $(dir $@) $(notdir $@)
 
 # Files under the faster/ sub-directory, however, are not meant to use the
 # fallback
@@ -88,18 +88,16 @@ ACDEFINES += -DBUILD_FASTER
 		--no-remove \
 		--no-remove-empty-directories \
 		$(TOPOBJDIR)/$* \
 		install_$(subst /,_,$*)
 
 # Preprocessed files. Ideally they would be using install manifests but
 # right now, it's not possible because of things like APP_BUILDID or
 # nsURLFormatter.js.
-# Things missing:
-# - XULPPFLAGS
 #
 # The list of preprocessed files is defined in PP_TARGETS. The list is
 # relative to TOPOBJDIR.
 # The source file for each of those preprocessed files is defined as a Make
 # dependency for the $(TOPOBJDIR)/path target. For example:
 #   PP_TARGETS = foo/bar
 #   $(TOPOBJDIR)/foo/bar: /path/to/source/for/foo/bar.in
 # The file name for the source doesn't need to be different.
@@ -109,28 +107,28 @@ ACDEFINES += -DBUILD_FASTER
 #   $(TOPOBJDIR)/foo/bar: defines = -Dqux=foobar
 $(addprefix $(TOPOBJDIR)/,$(PP_TARGETS)): Makefile
 $(addprefix $(TOPOBJDIR)/,$(PP_TARGETS)): $(TOPOBJDIR)/%:
 	$(PYTHON) -m mozbuild.action.preprocessor \
 		--depend $(TOPOBJDIR)/faster/.deps/$(subst /,_,$*) \
 		-DAB_CD=en-US \
 		$(defines) \
 		$(ACDEFINES) \
+		$(MOZ_DEBUG_DEFINES) \
 		$< \
 		-o $@
 
 # Include the dependency files from the above preprocessed files rule.
 $(foreach pp_target,$(PP_TARGETS), \
 	$(eval -include $(TOPOBJDIR)/faster/.deps/$(subst /,_,$(pp_target))))
 
 # Install files from jar manifests. Ideally, they would be using install
 # manifests, but the code to read jar manifests and emit appropriate
 # install manifests is not there yet.
 # Things missing:
-# - XULPPFLAGS
 # - DEFINES from config/config.mk
 # - L10N
 # - -e when USE_EXTENSION_MANIFEST is set in moz.build
 #
 # The list given in JAR_MN_TARGETS corresponds to the list of `jar-%` targets
 # to be processed, with the `jar-` prefix stripped.
 # The Makefile is expected to specify the source jar manifest as a dependency
 # to each target. There is no expectation that the `jar-%` target name matches
@@ -160,16 +158,17 @@ jar-%:
 	$(PYTHON) -m mozbuild.action.jar_maker \
 		-j $(TOPOBJDIR)/$(install_target)/chrome \
 		-t $(TOPSRCDIR) \
 		-f $(MOZ_CHROME_FILE_FORMAT) \
 		-c $(dir $<)/en-US \
 		-DAB_CD=en-US \
 		$(defines) \
 		$(ACDEFINES) \
+		$(MOZ_DEBUG_DEFINES) \
 		$<
 
 # Create some chrome manifests
 # This rule is forced to run every time because it may be updating files that
 # already exit.
 #
 # The list of chrome manifests is given in MANIFEST_TARGETS, relative to the
 # top object directory. The content for those manifests is given in the
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -1257,17 +1257,17 @@ ifndef XPI_ROOT_APPID
 $(error XPI_ROOT_APPID is not defined - langpacks will break.)
 endif
 endif
 endif
 
 libs realchrome:: $(FINAL_TARGET)/chrome
 	$(call py_action,jar_maker,\
 	  $(QUIET) -j $(FINAL_TARGET)/chrome \
-	  $(MAKE_JARS_FLAGS) $(XULPPFLAGS) $(DEFINES) $(ACDEFINES) \
+	  $(MAKE_JARS_FLAGS) $(DEFINES) $(ACDEFINES) $(MOZ_DEBUG_DEFINES) \
 	  $(JAR_MANIFEST))
 
 endif
 
 # This is a temporary check to ensure patches relying on the old behavior
 # of silently picking up jar.mn files continue to work.
 else # No JAR_MANIFEST
 ifneq (,$(wildcard $(srcdir)/jar.mn))
@@ -1511,17 +1511,17 @@ pp_target_results = $(foreach file,$($(1
 $(foreach tier,$(PP_TARGETS_TIERS), \
   $(eval $(tier):: $(PP_TARGETS_RESULTS_$(tier))) \
 )
 
 PP_TARGETS_ALL_RESULTS := $(sort $(foreach tier,$(PP_TARGETS_TIERS),$(PP_TARGETS_RESULTS_$(tier))))
 $(PP_TARGETS_ALL_RESULTS):
 	$(if $(filter-out $(notdir $@),$(notdir $(<:.in=))),$(error Looks like $@ has an unexpected dependency on $< which breaks PP_TARGETS))
 	$(RM) '$@'
-	$(call py_action,preprocessor,--depend $(MDDEPDIR)/$(@F).pp $(PP_TARGET_FLAGS) $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) '$<' -o '$@')
+	$(call py_action,preprocessor,--depend $(MDDEPDIR)/$(@F).pp $(PP_TARGET_FLAGS) $(DEFINES) $(ACDEFINES) $(MOZ_DEBUG_DEFINES) '$<' -o '$@')
 
 # The depfile is based on the filename, and we don't want conflicts. So check
 # there's only one occurrence of any given filename in PP_TARGETS_ALL_RESULTS.
 PP_TARGETS_ALL_RESULT_NAMES := $(notdir $(PP_TARGETS_ALL_RESULTS))
 $(foreach file,$(sort $(PP_TARGETS_ALL_RESULT_NAMES)), \
   $(if $(filter-out 1,$(words $(filter $(file),$(PP_TARGETS_ALL_RESULT_NAMES)))), \
     $(error Multiple preprocessing rules are creating a $(file) file) \
   ) \
--- a/configure.in
+++ b/configure.in
@@ -8552,18 +8552,16 @@ AC_SUBST(IMPLIB)
 AC_SUBST(FILTER)
 AC_SUBST(BIN_FLAGS)
 AC_SUBST(MOZ_WIDGET_TOOLKIT)
 AC_SUBST(MOZ_UPDATE_XTERM)
 AC_SUBST(MOZ_AUTH_EXTENSION)
 AC_SUBST(MOZ_PREF_EXTENSIONS)
 AC_SUBST(MOZ_DEBUG)
 AC_SUBST(MOZ_DEBUG_SYMBOLS)
-AC_SUBST(MOZ_DEBUG_ENABLE_DEFS)
-AC_SUBST(MOZ_DEBUG_DISABLE_DEFS)
 AC_SUBST(MOZ_DEBUG_LDFLAGS)
 AC_SUBST(WARNINGS_AS_ERRORS)
 AC_SUBST_SET(MOZ_EXTENSIONS)
 AC_SUBST(MOZ_ENABLE_PROFILER_SPS)
 AC_SUBST(MOZ_JPROF)
 AC_SUBST(MOZ_INSTRUMENTS)
 AC_SUBST(MOZ_CALLGRIND)
 AC_SUBST(MOZ_VTUNE)
--- a/db/sqlite3/src/Makefile.in
+++ b/db/sqlite3/src/Makefile.in
@@ -10,11 +10,11 @@ DEFFILE = $(CURDIR)/sqlite-processed.def
 
 GARBAGE += \
   $(DEFFILE) \
   $(NULL)
 
 # We have to preprocess our def file because we need different symbols in debug
 # builds exposed that are not built in non-debug builds.
 $(DEFFILE): sqlite.def
-	@$(call py_action,preprocessor,$(DEFINES) $(XULPPFLAGS) \
+	@$(call py_action,preprocessor,$(DEFINES) $(MOZ_DEBUG_DEFINES) \
 	  $(srcdir)/sqlite.def -o $(DEFFILE))
 endif
--- a/devtools/.eslintrc
+++ b/devtools/.eslintrc
@@ -20,16 +20,21 @@
     "Task": true,
     "XPCNativeWrapper": true,
     "XPCOMUtils": true,
   },
   "rules": {
     // These are the rules that have been configured so far to match the
     // devtools coding style.
 
+    // Rules from the mozilla plugin
+    "mozilla/components-imports": 1,
+    "mozilla/import-headjs-globals": 1,
+    "mozilla/mark-test-function-used": 1,
+
     // Disallow using variables outside the blocks they are defined (especially
     // since only let and const are used, see "no-var").
     "block-scoped-var": 2,
     // Enforce one true brace style (opening brace on the same line) and avoid
     // start and end braces on the same line.
     "brace-style": [2, "1tbs", {"allowSingleLine": false}],
     // Require camel case names
     "camelcase": 2,
--- a/devtools/.eslintrc.mochitests
+++ b/devtools/.eslintrc.mochitests
@@ -1,26 +1,20 @@
 // Parent config file for all devtools browser mochitest files.
 {
   "rules": {
-    // Only disallow non-global unused vars, so that things like the test
-    // function do not produce errors.
-    "no-unused-vars": [2, {"vars": "local"}],
-    // Allow using undefined variables so that tests can refer to functions
-    // and variables defined in head.js files, without having to maintain a
-    // list of globals in each .eslintrc file.
-    // Note that bug 1168340 will eventually help auto-registering globals
-    // from head.js files.
-    "no-undef": 0,
-    "block-scoped-var": 0
+    // Only disallow non-global unused vars, so that head.js does not produce
+    // errors.
+    "no-unused-vars": [2, {"vars": "local"}]
   },
   // All globals made available in the test environment.
   "globals": {
     "add_task": true,
     "Assert": true,
+    "BrowserTestUtils": true,
     "content": true,
     "document": true,
     "EventUtils": true,
     "executeSoon": true,
     "export_assertions": true,
     "finish": true,
     "gBrowser": true,
     "gDevTools": true,
@@ -33,18 +27,17 @@
     "navigator": true,
     "ok": true,
     "promise": true,
     "registerCleanupFunction": true,
     "requestLongerTimeout": true,
     "setTimeout": true,
     "SimpleTest": true,
     "SpecialPowers": true,
-    "test": true,
     "todo": true,
     "todo_is": true,
     "todo_isnot": true,
     "waitForClipboard": true,
     "waitForExplicitFinish": true,
     "waitForFocus": true,
     "window": true,
   }
-}
\ No newline at end of file
+}
--- a/devtools/client/animationinspector/animation-controller.js
+++ b/devtools/client/animationinspector/animation-controller.js
@@ -1,15 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* globals ViewHelpers, Task, AnimationsPanel, promise, EventEmitter,
-   AnimationsFront */
+/* globals AnimationsPanel */
 
 "use strict";
 
 const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
 
 Cu.import("resource://gre/modules/Task.jsm");
 var { loader, require } = Cu.import("resource://gre/modules/devtools/shared/Loader.jsm");
 Cu.import("resource://gre/modules/devtools/shared/Console.jsm");
--- a/devtools/client/animationinspector/components.js
+++ b/devtools/client/animationinspector/components.js
@@ -1,14 +1,13 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* globals ViewHelpers */
 
 "use strict";
 
 // Set of reusable UI components for the animation-inspector UI.
 // All components in this module share a common API:
 // 1. construct the component:
 //    let c = new ComponentName();
 // 2. initialize the markup of the component in a given parent node:
--- a/devtools/client/app-manager/app-projects.js
+++ b/devtools/client/app-manager/app-projects.js
@@ -203,17 +203,17 @@ const AppProjects = {
       return store.object.projects[store.object.projects.length - 1];
     });
   },
 
   update: function (project) {
     return IDB.update(project);
   },
 
-  updateLocation: function(project, newLocation) {
+  updateLocation: function(project, newLocation) {
     return IDB.remove(project.location)
               .then(() => {
                 project.location = newLocation;
                 return IDB.add(project);
               });
   },
 
   remove: function(location) {
--- a/devtools/client/framework/toolbox-hosts.js
+++ b/devtools/client/framework/toolbox-hosts.js
@@ -1,12 +1,11 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* globals DOMHelpers, Services */
 
 "use strict";
 
 const {Cu} = require("chrome");
 const EventEmitter = require("devtools/shared/event-emitter");
 const promise = require("promise");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource:///modules/devtools/client/shared/DOMHelpers.jsm");
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -1,14 +1,11 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* globals gDevTools, DOMHelpers, toolboxStrings, InspectorFront, Selection,
-   CommandUtils, DevToolsUtils, Hosts, osString, showDoorhanger,
-   getHighlighterUtils, createPerformanceFront */
 
 "use strict";
 
 const MAX_ORDINAL = 99;
 const ZOOM_PREF = "devtools.toolbox.zoomValue";
 const SPLITCONSOLE_ENABLED_PREF = "devtools.toolbox.splitconsoleEnabled";
 const SPLITCONSOLE_HEIGHT_PREF = "devtools.toolbox.splitconsoleHeight";
 const MIN_ZOOM = 0.5;
--- a/devtools/client/layoutview/view.js
+++ b/devtools/client/layoutview/view.js
@@ -1,14 +1,13 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* globals ViewHelpers, window, document */
 
 "use strict";
 
 const {utils: Cu, interfaces: Ci, classes: Cc} = Components;
 
 Cu.import("resource://gre/modules/Task.jsm");
 const {require} = Cu.import("resource://gre/modules/devtools/shared/Loader.jsm", {});
 Cu.import("resource://gre/modules/devtools/shared/Console.jsm");
--- a/devtools/client/markupview/markup-view.js
+++ b/devtools/client/markupview/markup-view.js
@@ -8,17 +8,16 @@ const {Cc, Cu, Ci} = require("chrome");
 
 // Page size for pageup/pagedown
 const PAGE_SIZE = 10;
 const DEFAULT_MAX_CHILDREN = 100;
 const COLLAPSE_ATTRIBUTE_LENGTH = 120;
 const COLLAPSE_DATA_URL_REGEX = /^data.+base64/;
 const COLLAPSE_DATA_URL_LENGTH = 60;
 const NEW_SELECTION_HIGHLIGHTER_TIMER = 1000;
-const GRAB_DELAY = 400;
 const DRAG_DROP_AUTOSCROLL_EDGE_DISTANCE = 50;
 const DRAG_DROP_MIN_AUTOSCROLL_SPEED = 5;
 const DRAG_DROP_MAX_AUTOSCROLL_SPEED = 15;
 const AUTOCOMPLETE_POPUP_PANEL_ID = "markupview_autoCompletePopup";
 
 const {UndoStack} = require("devtools/client/shared/undo");
 const {editableField, InplaceEditor} = require("devtools/client/shared/inplace-editor");
 const {gDevTools} = Cu.import("resource:///modules/devtools/client/framework/gDevTools.jsm", {});
@@ -129,16 +128,21 @@ function MarkupView(aInspector, aFrame, 
 
 exports.MarkupView = MarkupView;
 
 MarkupView.prototype = {
   /**
    * How long does a node flash when it mutates (in ms).
    */
   CONTAINER_FLASHING_DURATION: 500,
+  /**
+   * How long do you have to hold the mouse down before a drag
+   * starts (in ms).
+   */
+  GRAB_DELAY: 400,
 
   _selectedContainer: null,
 
   _initTooltips: function() {
     this.tooltip = new Tooltip(this._inspector.panelDoc);
     this._makeTooltipPersistent(false);
 
     this._elt.addEventListener("click", this._onMouseClick, false);
@@ -825,17 +829,17 @@ MarkupView.prototype = {
       }
       if (type === "attributes" || type === "characterData") {
         container.update();
 
         // Auto refresh style properties on selected node when they change.
         if (type === "attributes" && container.selected) {
           requiresLayoutChange = true;
         }
-      } else if (type === "childList") {
+      } else if (type === "childList" || type === "nativeAnonymousChildList") {
         container.childrenDirty = true;
         // Update the children to take care of changes in the markup view DOM.
         this._updateChildren(container, {flash: true});
       } else if (type === "pseudoClassLock") {
         container.update();
       }
     }
 
@@ -1920,17 +1924,17 @@ MarkupContainer.prototype = {
       this.isDragging = true;
 
       this._dragStartY = event.pageY;
       this.markup.indicateDropTarget(this.elt);
 
       // If this is the last child, use the closing <div.tag-line> of parent as indicator
       this.markup.indicateDragTarget(this.elt.nextElementSibling ||
                                      this.markup.getContainer(this.node.parentNode()).closeTagLine);
-    }, GRAB_DELAY);
+    }, this.GRAB_DELAY);
   },
 
   /**
    * On mouse up, stop dragging.
    */
   _onMouseUp: Task.async(function*() {
     this._isMouseDown = false;
 
--- a/devtools/client/markupview/test/browser_markupview_dragdrop_reorder.js
+++ b/devtools/client/markupview/test/browser_markupview_dragdrop_reorder.js
@@ -2,20 +2,21 @@
 /* Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 // Test different kinds of drag and drop node re-ordering
 
 const TEST_URL = TEST_URL_ROOT + "doc_markup_dragdrop.html";
-const GRAB_DELAY = 400;
+const GRAB_DELAY = 5;
 
 add_task(function*() {
   let {inspector} = yield addTab(TEST_URL).then(openInspector);
+  inspector.markup.GRAB_DELAY = GRAB_DELAY;
 
   info("Expanding #test");
   let parentFront = yield getNodeFront("#test", inspector);
   let parent = yield getNode("#test");
   let parentContainer = yield getContainerForNodeFront(parentFront, inspector);
 
   yield inspector.markup.expandNode(parentFront);
   yield waitForMultipleChildrenUpdates(inspector);
--- a/devtools/client/markupview/test/browser_markupview_mutation_01.js
+++ b/devtools/client/markupview/test/browser_markupview_mutation_01.js
@@ -5,16 +5,18 @@
 "use strict";
 
 // Tests that various mutations to the dom update the markup view correctly.
 
 const TEST_URL = TEST_URL_ROOT + "doc_markup_mutation.html";
 
 // Mutation tests. Each entry in the array has the following properties:
 // - desc: for logging only
+// - numMutations: how many mutations are expected to come happen due to the
+//   test case.  Defaults to 1 if not set.
 // - test: a function supposed to mutate the DOM
 // - check: a function supposed to test that the mutation was handled
 const TEST_DATA = [
   {
     desc: "Adding an attribute",
     test: () => {
       let node1 = getNode("#node1");
       node1.setAttribute("newattr", "newattrval");
@@ -61,16 +63,41 @@ const TEST_DATA = [
     check: function*(inspector) {
       let {editor} = yield getContainerForSelector("#node1", inspector);
       ok([...editor.attrList.querySelectorAll(".attreditor")].some(attr => {
         return attr.textContent.trim() === "newattr=\"newattrchanged\"";
       }), "newattr attribute found");
     }
   },
   {
+    desc: "Adding ::after element",
+    numMutations: 2,
+    test: () => {
+      let node1 = getNode("#node1");
+      node1.classList.add("pseudo");
+    },
+    check: function*(inspector) {
+      let {children} = yield getContainerForSelector("#node1", inspector);
+      is(children.childNodes.length, 2,
+        "Node1 now has 2 children (text child and ::after");
+    }
+  },
+  {
+    desc: "Removing ::after element",
+    numMutations: 2,
+    test: () => {
+      let node1 = getNode("#node1");
+      node1.classList.remove("pseudo");
+    },
+    check: function*(inspector) {
+      let container = yield getContainerForSelector("#node1", inspector);
+      ok(container.singleTextChild, "Has single text child.");
+    }
+  },
+  {
     desc: "Updating the text-content",
     test: () => {
       let node1 = getNode("#node1");
       node1.textContent = "newtext";
     },
     check: function*(inspector) {
       let container = yield getContainerForSelector("#node1", inspector);
       ok(container.singleTextChild, "Has single text child.");
@@ -236,23 +263,38 @@ const TEST_DATA = [
 ];
 
 add_task(function*() {
   let {toolbox, inspector} = yield addTab(TEST_URL).then(openInspector);
 
   info("Expanding all markup-view nodes");
   yield inspector.markup.expandAll();
 
-  for (let {desc, test, check} of TEST_DATA) {
+  for (let {desc, test, check, numMutations} of TEST_DATA) {
     info("Starting test: " + desc);
 
+    numMutations = numMutations || 1;
+
     info("Executing the test markup mutation");
-    let onMutation = inspector.once("markupmutation");
-    test();
-    yield onMutation;
+    yield new Promise((resolve) => {
+      // If a test expects more than one mutation it may come through in a
+      // single event or possibly in multiples.
+      let seenMutations = 0;
+      inspector.on("markupmutation", function onmutation(e, mutations) {
+        seenMutations += mutations.length;
+        info("Receieved " + seenMutations +
+             " mutations, expecting at least " + numMutations);
+        if (seenMutations >= numMutations) {
+          inspector.off("markupmutation", onmutation);
+          resolve();
+        }
+      });
+
+      test();
+    })
 
     info("Expanding all markup-view nodes to make sure new nodes are imported");
     yield inspector.markup.expandAll();
 
     info("Checking the markup-view content");
     yield check(inspector);
   }
 });
--- a/devtools/client/markupview/test/doc_markup_mutation.html
+++ b/devtools/client/markupview/test/doc_markup_mutation.html
@@ -1,11 +1,16 @@
 <!DOCTYPE html>
 
 <html class="html">
+  <style type="text/css">
+    #node1.pseudo::after {
+      content: "after";
+    }
+  </style>
 
   <body class="body">
     <div class="node0">
       <div id="node1" class="node1">line1</div>
       <div id="node2" class="node2">line2</div>
       <p class="node3">line3</p>
       <!-- A comment -->
       <p id="node4" class="node4">line4
--- a/devtools/client/promisedebugger/promise-controller.js
+++ b/devtools/client/promisedebugger/promise-controller.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-/* global promise, PromisesPanel, PromisesFront, DevToolsUtils */
+/* global PromisesPanel */
 
 "use strict";
 
 const { utils: Cu } = Components;
 const { loader, require } =
   Cu.import("resource://gre/modules/devtools/shared/Loader.jsm", {});
 
 const { Task } = require("resource://gre/modules/Task.jsm");
--- a/devtools/client/responsivedesign/responsivedesign.jsm
+++ b/devtools/client/responsivedesign/responsivedesign.jsm
@@ -228,17 +228,19 @@ function ResponsiveUI(aWindow, aTab)
     window: this.mainWindow,
     type: "deveditionpromo",
     anchor: this.chromeDoc.querySelector("#content")
   });
 }
 
 ResponsiveUI.prototype = {
   _transitionsEnabled: true,
-  get transitionsEnabled() this._transitionsEnabled,
+  get transitionsEnabled() {
+    return this._transitionsEnabled;
+  },
   set transitionsEnabled(aValue) {
     this._transitionsEnabled = aValue;
     if (aValue && !this._resizing && this.stack.hasAttribute("responsivemode")) {
       this.stack.removeAttribute("notransition");
     } else if (!aValue) {
       this.stack.setAttribute("notransition", "true");
     }
   },
--- a/devtools/client/shared/AppCacheUtils.jsm
+++ b/devtools/client/shared/AppCacheUtils.jsm
@@ -611,17 +611,17 @@ ManifestParser.prototype = {
           this._addError(this.currentLine,
                          "invalidSectionName", text, this.currentLine);
           return false;
       }
     }
   },
 };
 
-XPCOMUtils.defineLazyGetter(this, "l10n", function() Services.strings
+XPCOMUtils.defineLazyGetter(this, "l10n", () => Services.strings
   .createBundle("chrome://browser/locale/devtools/appcacheutils.properties"));
 
 XPCOMUtils.defineLazyGetter(this, "appcacheservice", function() {
   return Cc["@mozilla.org/network/application-cache-service;1"]
            .getService(Ci.nsIApplicationCacheService);
 
 });
 
--- a/devtools/client/shared/SplitView.jsm
+++ b/devtools/client/shared/SplitView.jsm
@@ -81,31 +81,40 @@ this.SplitView = function SplitView(aRoo
 }
 
 SplitView.prototype = {
   /**
     * Retrieve whether the UI currently has a landscape orientation.
     *
     * @return boolean
     */
-  get isLandscape() this._mql.matches,
+  get isLandscape()
+  {
+    return this._mql.matches;
+  },
 
   /**
     * Retrieve the root element.
     *
     * @return DOMElement
     */
-  get rootElement() this._root,
+  get rootElement()
+  {
+    return this._root;
+  },
 
   /**
     * Retrieve the active item's summary element or null if there is none.
     *
     * @return DOMElement
     */
-  get activeSummary() this._activeSummary,
+  get activeSummary()
+  {
+    return this._activeSummary;
+  },
 
   /**
     * Set the active item's summary element.
     *
     * @param DOMElement aSummary
     */
   set activeSummary(aSummary)
   {
--- a/devtools/client/shared/inplace-editor.js
+++ b/devtools/client/shared/inplace-editor.js
@@ -1,16 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-/* globals focusManager, CSSPropertyList, domUtils */
-
 /**
  * Basic use:
  * let spanToEdit = document.getElementById("somespan");
  *
  * editableField({
  *   element: spanToEdit,
  *   done: function(value, commit, direction) {
  *     if (commit) {
--- a/devtools/client/shared/widgets/SideMenuWidget.jsm
+++ b/devtools/client/shared/widgets/SideMenuWidget.jsm
@@ -71,17 +71,17 @@ SideMenuWidget.prototype = {
   /**
    * Specifies if groups in this container should be sorted.
    */
   sortedGroups: true,
 
   /**
    * The comparator used to sort groups.
    */
-  groupSortPredicate: function(a, b) a.localeCompare(b),
+  groupSortPredicate: (a, b) => a.localeCompare(b),
 
   /**
    * Inserts an item in this container at the specified index, optionally
    * grouping by name.
    *
    * @param number aIndex
    *        The position in the container intended for this item.
    * @param nsIDOMNode aContents
@@ -483,18 +483,22 @@ function SideMenuGroup(aWidget, aName, a
   else {
     let target = this._target = this._list = this.document.createElement("vbox");
     target.className = "side-menu-widget-group side-menu-widget-group-list";
     target.setAttribute("merged-group-contents", "");
   }
 }
 
 SideMenuGroup.prototype = {
-  get _orderedGroupElementsArray() this.ownerView._orderedGroupElementsArray,
-  get _orderedMenuElementsArray() this.ownerView._orderedMenuElementsArray,
+  get _orderedGroupElementsArray() {
+    return this.ownerView._orderedGroupElementsArray;
+  },
+  get _orderedMenuElementsArray() {
+    return this.ownerView._orderedMenuElementsArray;
+  },
   get _itemsByElement() { return this.ownerView._itemsByElement; },
 
   /**
    * Inserts this group in the parent container at the specified index.
    *
    * @param number aIndex
    *        The position in the container intended for this group.
    */
@@ -590,18 +594,22 @@ function SideMenuItem(aGroup, aContents,
     target.setAttribute("merged-item-contents", "");
   }
 
   this._target.setAttribute("flex", "1");
   this.contents = aContents;
 }
 
 SideMenuItem.prototype = {
-  get _orderedGroupElementsArray() this.ownerView._orderedGroupElementsArray,
-  get _orderedMenuElementsArray() this.ownerView._orderedMenuElementsArray,
+  get _orderedGroupElementsArray() {
+    return this.ownerView._orderedGroupElementsArray;
+  },
+  get _orderedMenuElementsArray() {
+    return this.ownerView._orderedMenuElementsArray;
+  },
   get _itemsByElement() { return this.ownerView._itemsByElement; },
 
   /**
    * Inserts this item in the parent group at the specified index.
    *
    * @param number aIndex
    *        The position in the container intended for this item.
    * @return nsIDOMNode
--- a/devtools/client/shared/widgets/Tooltip.js
+++ b/devtools/client/shared/widgets/Tooltip.js
@@ -1,17 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-/* globals beautify, setNamedTimeout, clearNamedTimeout, VariablesView,
-   VariablesViewController, Task */
-
 const {Cu, Ci} = require("chrome");
 const promise = require("promise");
 const {Spectrum} = require("devtools/client/shared/widgets/Spectrum");
 const {CubicBezierWidget} =
       require("devtools/client/shared/widgets/CubicBezierWidget");
 const {MdnDocsWidget} = require("devtools/client/shared/widgets/MdnDocsWidget");
 const {CSSFilterEditorWidget} = require("devtools/client/shared/widgets/FilterWidget");
 const EventEmitter = require("devtools/shared/event-emitter");
--- a/devtools/client/shared/widgets/VariablesView.jsm
+++ b/devtools/client/shared/widgets/VariablesView.jsm
@@ -397,40 +397,46 @@ VariablesView.prototype = {
       this.nonEnumVisible = true;
     }
   },
 
   /**
    * Sets if the variable and property searching is enabled.
    * @param boolean aFlag
    */
-  set searchEnabled(aFlag) aFlag ? this._enableSearch() : this._disableSearch(),
+  set searchEnabled(aFlag) {
+    aFlag ? this._enableSearch() : this._disableSearch();
+  },
 
   /**
    * Gets if the variable and property searching is enabled.
    * @return boolean
    */
-  get searchEnabled() !!this._searchboxContainer,
+  get searchEnabled() {
+    return !!this._searchboxContainer;
+  },
 
   /**
    * Sets the text displayed for the searchbox in this container.
    * @param string aValue
    */
   set searchPlaceholder(aValue) {
     if (this._searchboxNode) {
       this._searchboxNode.setAttribute("placeholder", aValue);
     }
     this._searchboxPlaceholder = aValue;
   },
 
   /**
    * Gets the text displayed for the searchbox in this container.
    * @return string
    */
-  get searchPlaceholder() this._searchboxPlaceholder,
+  get searchPlaceholder() {
+    return this._searchboxPlaceholder;
+  },
 
   /**
    * Enables variable and property searching in this view.
    * Use the "searchEnabled" setter to enable searching.
    */
   _enableSearch: function() {
     // If searching was already enabled, no need to re-enable it again.
     if (this._searchboxContainer) {
@@ -992,35 +998,43 @@ VariablesView.prototype = {
       this._parent.removeAttribute("actions-first");
     }
   },
 
   /**
    * Gets the parent node holding this view.
    * @return nsIDOMNode
    */
-  get boxObject() this._list.boxObject,
+  get boxObject() {
+    return this._list.boxObject;
+  },
 
   /**
    * Gets the parent node holding this view.
    * @return nsIDOMNode
    */
-  get parentNode() this._parent,
+  get parentNode() {
+    return this._parent;
+  },
 
   /**
    * Gets the owner document holding this view.
    * @return nsIHTMLDocument
    */
-  get document() this._document || (this._document = this._parent.ownerDocument),
+  get document() {
+    return this._document || (this._document = this._parent.ownerDocument);
+  },
 
   /**
    * Gets the default window holding this view.
    * @return nsIDOMWindow
    */
-  get window() this._window || (this._window = this.document.defaultView),
+  get window() {
+    return this._window || (this._window = this.document.defaultView);
+  },
 
   _document: null,
   _window: null,
 
   _store: null,
   _itemsByElement: null,
   _prevHierarchy: null,
   _currHierarchy: null,
@@ -1582,71 +1596,91 @@ Scope.prototype = {
     this._arrow.setAttribute("invisible", "");
     this._isArrowVisible = false;
   },
 
   /**
    * Gets the visibility state.
    * @return boolean
    */
-  get visible() this._isContentVisible,
+  get visible() {
+    return this._isContentVisible;
+  },
 
   /**
    * Gets the expanded state.
    * @return boolean
    */
-  get expanded() this._isExpanded,
+  get expanded() {
+    return this._isExpanded;
+  },
 
   /**
    * Gets the header visibility state.
    * @return boolean
    */
-  get header() this._isHeaderVisible,
+  get header() {
+    return this._isHeaderVisible;
+  },
 
   /**
    * Gets the twisty visibility state.
    * @return boolean
    */
-  get twisty() this._isArrowVisible,
+  get twisty() {
+    return this._isArrowVisible;
+  },
 
   /**
    * Gets the expand lock state.
    * @return boolean
    */
-  get locked() this._isLocked,
+  get locked() {
+    return this._isLocked;
+  },
 
   /**
    * Sets the visibility state.
    * @param boolean aFlag
    */
-  set visible(aFlag) aFlag ? this.show() : this.hide(),
+  set visible(aFlag) {
+    aFlag ? this.show() : this.hide();
+  },
 
   /**
    * Sets the expanded state.
    * @param boolean aFlag
    */
-  set expanded(aFlag) aFlag ? this.expand() : this.collapse(),
+  set expanded(aFlag) {
+    aFlag ? this.expand() : this.collapse();
+  },
 
   /**
    * Sets the header visibility state.
    * @param boolean aFlag
    */
-  set header(aFlag) aFlag ? this.showHeader() : this.hideHeader(),
+  set header(aFlag) {
+    aFlag ? this.showHeader() : this.hideHeader();
+  },
 
   /**
    * Sets the twisty visibility state.
    * @param boolean aFlag
    */
-  set twisty(aFlag) aFlag ? this.showArrow() : this.hideArrow(),
+  set twisty(aFlag) {
+    aFlag ? this.showArrow() : this.hideArrow();
+  },
 
   /**
    * Sets the expand lock state.
    * @param boolean aFlag
    */
-  set locked(aFlag) this._isLocked = aFlag,
+  set locked(aFlag) {
+    this._isLocked = aFlag;
+  },
 
   /**
    * Specifies if this target node may be focused.
    * @return boolean
    */
   get focusable() {
     // Check if this target node is actually visibile.
     if (!this._nameString ||
@@ -1693,41 +1727,51 @@ Scope.prototype = {
   removeEventListener: function(aName, aCallback, aCapture) {
     this._title.removeEventListener(aName, aCallback, aCapture);
   },
 
   /**
    * Gets the id associated with this item.
    * @return string
    */
-  get id() this._idString,
+  get id() {
+    return this._idString;
+  },
 
   /**
    * Gets the name associated with this item.
    * @return string
    */
-  get name() this._nameString,
+  get name() {
+    return this._nameString;
+  },
 
   /**
    * Gets the displayed value for this item.
    * @return string
    */
-  get displayValue() this._valueString,
+  get displayValue() {
+    return this._valueString;
+  },
 
   /**
    * Gets the class names used for the displayed value.
    * @return string
    */
-  get displayValueClassName() this._valueClassName,
+  get displayValueClassName() {
+    return this._valueClassName;
+  },
 
   /**
    * Gets the element associated with this item.
    * @return nsIDOMNode
    */
-  get target() this._target,
+  get target() {
+    return this._target;
+  },
 
   /**
    * Initializes this scope's id, view and binds event listeners.
    *
    * @param string aName
    *        The scope's name.
    * @param object aFlags [optional]
    *        Additional options or flags for this scope.
@@ -1999,43 +2043,51 @@ Scope.prototype = {
 
     return null;
   },
 
   /**
    * Gets top level variables view instance.
    * @return VariablesView
    */
-  get _variablesView() this._topView || (this._topView = (function(self) {
-    let parentView = self.ownerView;
-    let topView;
-
-    while ((topView = parentView.ownerView)) {
-      parentView = topView;
-    }
-    return parentView;
-  })(this)),
+  get _variablesView() {
+    return this._topView || (this._topView = (() => {
+      let parentView = this.ownerView;
+      let topView;
+
+      while ((topView = parentView.ownerView)) {
+        parentView = topView;
+      }
+      return parentView;
+    })());
+  },
 
   /**
    * Gets the parent node holding this scope.
    * @return nsIDOMNode
    */
-  get parentNode() this.ownerView._list,
+  get parentNode() {
+    return this.ownerView._list;
+  },
 
   /**
    * Gets the owner document holding this scope.
    * @return nsIHTMLDocument
    */
-  get document() this._document || (this._document = this.ownerView.document),
+  get document() {
+    return this._document || (this._document = this.ownerView.document);
+  },
 
   /**
    * Gets the default window holding this scope.
    * @return nsIDOMWindow
    */
-  get window() this._window || (this._window = this.ownerView.window),
+  get window() {
+    return this._window || (this._window = this.ownerView.window);
+  },
 
   _topView: null,
   _document: null,
   _window: null,
 
   ownerView: null,
   eval: null,
   switch: null,
@@ -2328,29 +2380,35 @@ Variable.prototype = Heritage.extend(Sco
     }
     return path;
   },
 
   /**
    * Returns this variable's value from the descriptor if available.
    * @return any
    */
-  get value() this._initialDescriptor.value,
+  get value() {
+    return this._initialDescriptor.value;
+  },
 
   /**
    * Returns this variable's getter from the descriptor if available.
    * @return object
    */
-  get getter() this._initialDescriptor.get,
+  get getter() {
+    return this._initialDescriptor.get;
+  },
 
   /**
    * Returns this variable's getter from the descriptor if available.
    * @return object
    */
-  get setter() this._initialDescriptor.set,
+  get setter() {
+    return this._initialDescriptor.set;
+  },
 
   /**
    * Sets the specific grip for this variable (applies the text content and
    * class name to the value label).
    *
    * The grip should contain the value or the type & class, as defined in the
    * remote debugger protocol. For convenience, undefined and null are
    * both considered types.
--- a/devtools/client/shared/widgets/ViewHelpers.jsm
+++ b/devtools/client/shared/widgets/ViewHelpers.jsm
@@ -766,17 +766,19 @@ this.WidgetMethods = {
       aWidget.on("mousePress", this._onWidgetMousePress.bind(this));
     }
   },
 
   /**
    * Gets the element node or widget associated with this container.
    * @return nsIDOMNode | object
    */
-  get widget() this._widget,
+  get widget() {
+    return this._widget;
+  },
 
   /**
    * Prepares an item to be added to this container. This allows, for example,
    * for a large number of items to be batched up before being sorted & added.
    *
    * If the "staged" flag is *not* set to true, the item will be immediately
    * inserted at the correct position in this container, so that all the items
    * still remain sorted. This can (possibly) be much slower than batching up
--- a/devtools/client/styleinspector/computed-view.js
+++ b/devtools/client/styleinspector/computed-view.js
@@ -1,16 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-/* globals overlays, StyleInspectorMenu, loader, clipboardHelper,
-  _Iterator, StopIteration */
+/* globals _Iterator, StopIteration */
 
 "use strict";
 
 const {Cc, Ci, Cu} = require("chrome");
 
 const ToolDefinitions = require("devtools/client/main").Tools;
 const {CssLogic} = require("devtools/shared/styleinspector/css-logic");
 const {ELEMENT_STYLE} = require("devtools/server/actors/styles");
--- a/devtools/client/styleinspector/rule-view.js
+++ b/devtools/client/styleinspector/rule-view.js
@@ -1,18 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-/* globals overlays, Services, EventEmitter, StyleInspectorMenu,
-   clipboardHelper, _strings, domUtils, AutocompletePopup, loader,
-   osString */
-
 "use strict";
 
 const {Cc, Ci, Cu} = require("chrome");
 const promise = require("promise");
 const {setTimeout, clearTimeout} =
       Cu.import("resource://gre/modules/Timer.jsm", {});
 const {CssLogic} = require("devtools/shared/styleinspector/css-logic");
 const {InplaceEditor, editableField, editableItem} =
--- a/devtools/client/styleinspector/style-inspector-menu.js
+++ b/devtools/client/styleinspector/style-inspector-menu.js
@@ -1,16 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-/* globals overlays, Services, clipboardHelper, _strings */
-
 "use strict";
 
 const {Cc, Ci, Cu} = require("chrome");
 const {PREF_ORIG_SOURCES} = require("devtools/client/styleeditor/utils");
 
 loader.lazyRequireGetter(this, "overlays",
   "devtools/client/styleinspector/style-inspector-overlays");
 loader.lazyImporter(this, "Services", "resource://gre/modules/Services.jsm");
--- a/devtools/client/styleinspector/style-inspector.js
+++ b/devtools/client/styleinspector/style-inspector.js
@@ -1,16 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-/* globals RuleView, ComputedView, gDevTools */
-
 "use strict";
 
 const {Cc, Cu, Ci} = require("chrome");
 const promise = require("promise");
 const {Tools} = require("devtools/client/main");
 Cu.import("resource://gre/modules/Services.jsm");
 const {PREF_ORIG_SOURCES} = require("devtools/client/styleeditor/utils");
 
--- a/devtools/client/styleinspector/utils.js
+++ b/devtools/client/styleinspector/utils.js
@@ -1,16 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-/* global domUtils */
-
 "use strict";
 
 const {Cc, Ci, Cu} = require("chrome");
 const {setTimeout, clearTimeout} =
       Cu.import("resource://gre/modules/Timer.jsm", {});
 const {parseDeclarations} =
       require("devtools/client/styleinspector/css-parsing-utils");
 const promise = require("promise");
--- a/devtools/server/actors/inspector.js
+++ b/devtools/server/actors/inspector.js
@@ -1,12 +1,11 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* globals DevToolsUtils, DOMParser, eventListenerService, CssLogic */
 
 "use strict";
 
 /**
  * Here's the server side of the remote inspector.
  *
  * The WalkerActor is the client's view of the debuggee's DOM.  It's gives
  * the client a tree of NodeActor objects.
@@ -321,16 +320,17 @@ var NodeActor = exports.NodeActor = prot
    */
   watchDocument: function(callback) {
     let node = this.rawNode;
     // Create the observer on the node's actor.  The node will make sure
     // the observer is cleaned up when the actor is released.
     let observer = new node.defaultView.MutationObserver(callback);
     observer.mergeAttributeRecords = true;
     observer.observe(node, {
+      nativeAnonymousChildList: true,
       attributes: true,
       characterData: true,
       childList: true,
       subtree: true
     });
     this.mutationObserver = observer;
   },
 
@@ -994,17 +994,19 @@ var NodeFront = protocol.FrontClass(Node
   getFormProperty: function(name) {
     return this._form.props ? this._form.props[name] : null;
   },
 
   hasFormProperty: function(name) {
     return this._form.props ? (name in this._form.props) : null;
   },
 
-  get formProperties() this._form.props,
+  get formProperties() {
+    return this._form.props;
+  },
 
   /**
    * Return a new AttributeModificationList for this node.
    */
   startModifyingAttributes: function() {
     return AttributeModificationList(this);
   },
 
@@ -2806,35 +2808,36 @@ var WalkerActor = protocol.ActorClass({
    */
   onMutations: function(mutations) {
     for (let change of mutations) {
       let targetActor = this._refMap.get(change.target);
       if (!targetActor) {
         continue;
       }
       let targetNode = change.target;
+      let type = change.type;
       let mutation = {
-        type: change.type,
+        type: type,
         target: targetActor.actorID,
       };
 
-      if (mutation.type === "attributes") {
+      if (type === "attributes") {
         mutation.attributeName = change.attributeName;
         mutation.attributeNamespace = change.attributeNamespace || undefined;
         mutation.newValue = targetNode.hasAttribute(mutation.attributeName) ?
                             targetNode.getAttribute(mutation.attributeName)
                             : null;
-      } else if (mutation.type === "characterData") {
+      } else if (type === "characterData") {
         if (targetNode.nodeValue.length > gValueSummaryLength) {
           mutation.newValue = targetNode.nodeValue.substring(0, gValueSummaryLength);
           mutation.incompleteValue = true;
         } else {
           mutation.newValue = targetNode.nodeValue;
         }
-      } else if (mutation.type === "childList") {
+      } else if (type === "childList" || type === "nativeAnonymousChildList") {
         // Get the list of removed and added actors that the client has seen
         // so that it can keep its ownership tree up to date.
         let removedActors = [];
         let addedActors = [];
         for (let removed of change.removedNodes) {
           let removedActor = this._refMap.get(removed);
           if (!removedActor) {
             // If the client never encountered this actor we don't need to
@@ -3326,17 +3329,17 @@ var WalkerFront = exports.WalkerFront = 
 
         if (!targetFront) {
           console.trace("Got a mutation for an unexpected actor: " + targetID + ", please file a bug on bugzilla.mozilla.org!");
           continue;
         }
 
         let emittedMutation = object.merge(change, { target: targetFront });
 
-        if (change.type === "childList") {
+        if (change.type === "childList" || change.type === "nativeAnonymousChildList") {
           // Update the ownership tree according to the mutation record.
           let addedFronts = [];
           let removedFronts = [];
           for (let removed of change.removed) {
             let removedFront = this.get(removed);
             if (!removedFront) {
               console.error("Got a removal of an actor we didn't know about: " + removed);
               continue;
--- a/devtools/server/actors/promises.js
+++ b/devtools/server/actors/promises.js
@@ -7,18 +7,16 @@
 const protocol = require("devtools/server/protocol");
 const { method, RetVal, Arg, types } = protocol;
 const { expectState, ActorPool } = require("devtools/server/actors/common");
 const { ObjectActor,
         createValueGrip } = require("devtools/server/actors/object");
 const DevToolsUtils = require("devtools/shared/DevToolsUtils");
 loader.lazyRequireGetter(this, "events", "sdk/event/core");
 
-/* global events */
-
 // Teach protocol.js how to deal with legacy actor types
 types.addType("ObjectActor", {
   write: actor => actor.grip(),
   read: grip => grip
 });
 
 /**
  * The Promises Actor provides support for getting the list of live promises and
--- a/devtools/server/actors/styles.js
+++ b/devtools/server/actors/styles.js
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* globals CssLogic, DOMUtils, CSS */
+/* globals CSS */
 
 "use strict";
 
 const {Cc, Ci, Cu} = require("chrome");
 const promise = require("promise");
 const protocol = require("devtools/server/protocol");
 const {Arg, Option, method, RetVal, types} = protocol;
 const events = require("sdk/event/core");
--- a/devtools/shared/gcli/commands/highlight.js
+++ b/devtools/shared/gcli/commands/highlight.js
@@ -1,12 +1,11 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* globals nodesSelected, PluralForm */
 
 "use strict";
 
 const l10n = require("gcli/l10n");
 require("devtools/server/actors/inspector");
 const {
   BoxModelHighlighter,
   HighlighterEnvironment
new file mode 100644
--- /dev/null
+++ b/devtools/shared/heapsnapshot/.gitattributes
@@ -0,0 +1,1 @@
+CoreDump.pb.* binary
--- a/devtools/shared/heapsnapshot/AutoMemMap.h
+++ b/devtools/shared/heapsnapshot/AutoMemMap.h
@@ -1,14 +1,17 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+#ifndef mozilla_devtools_AutoMemMap_h
+#define mozilla_devtools_AutoMemMap_h
+
 #include <prio.h>
 #include "mozilla/GuardObjects.h"
 
 namespace mozilla {
 namespace devtools {
 
 // # AutoMemMap
 //
@@ -63,8 +66,10 @@ public:
 
   // Get the mapped memory.
   void* address() { MOZ_ASSERT(addr); return addr; }
   const void* address() const { MOZ_ASSERT(addr); return addr; }
 };
 
 } // namespace devtools
 } // namespace mozilla
+
+#endif // mozilla_devtools_AutoMemMap_h
--- a/devtools/shared/heapsnapshot/CoreDump.pb.cc
+++ b/devtools/shared/heapsnapshot/CoreDump.pb.cc
@@ -30,22 +30,38 @@ const ::google::protobuf::internal::Gene
   StackFrame_reflection_ = NULL;
 struct StackFrameOneofInstance {
   const ::mozilla::devtools::protobuf::StackFrame_Data* data_;
   ::google::protobuf::uint64 ref_;
 }* StackFrame_default_oneof_instance_ = NULL;
 const ::google::protobuf::Descriptor* StackFrame_Data_descriptor_ = NULL;
 const ::google::protobuf::internal::GeneratedMessageReflection*
   StackFrame_Data_reflection_ = NULL;
+struct StackFrame_DataOneofInstance {
+  const ::std::string* source_;
+  ::google::protobuf::uint64 sourceref_;
+  const ::std::string* functiondisplayname_;
+  ::google::protobuf::uint64 functiondisplaynameref_;
+}* StackFrame_Data_default_oneof_instance_ = NULL;
 const ::google::protobuf::Descriptor* Node_descriptor_ = NULL;
 const ::google::protobuf::internal::GeneratedMessageReflection*
   Node_reflection_ = NULL;
+struct NodeOneofInstance {
+  const ::std::string* typename__;
+  ::google::protobuf::uint64 typenameref_;
+  const ::std::string* jsobjectclassname_;
+  ::google::protobuf::uint64 jsobjectclassnameref_;
+}* Node_default_oneof_instance_ = NULL;
 const ::google::protobuf::Descriptor* Edge_descriptor_ = NULL;
 const ::google::protobuf::internal::GeneratedMessageReflection*
   Edge_reflection_ = NULL;
+struct EdgeOneofInstance {
+  const ::std::string* name_;
+  ::google::protobuf::uint64 nameref_;
+}* Edge_default_oneof_instance_ = NULL;
 
 }  // namespace
 
 
 void protobuf_AssignDesc_CoreDump_2eproto() {
   protobuf_AddDesc_CoreDump_2eproto();
   const ::google::protobuf::FileDescriptor* file =
     ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
@@ -81,71 +97,87 @@ void protobuf_AssignDesc_CoreDump_2eprot
       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame, _unknown_fields_),
       -1,
       StackFrame_default_oneof_instance_,
       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame, _oneof_case_[0]),
       ::google::protobuf::DescriptorPool::generated_pool(),
       ::google::protobuf::MessageFactory::generated_factory(),
       sizeof(StackFrame));
   StackFrame_Data_descriptor_ = StackFrame_descriptor_->nested_type(0);
-  static const int StackFrame_Data_offsets_[8] = {
+  static const int StackFrame_Data_offsets_[12] = {
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, id_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, parent_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, line_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, column_),
-    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, source_),
-    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, functiondisplayname_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(StackFrame_Data_default_oneof_instance_, source_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(StackFrame_Data_default_oneof_instance_, sourceref_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(StackFrame_Data_default_oneof_instance_, functiondisplayname_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(StackFrame_Data_default_oneof_instance_, functiondisplaynameref_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, issystem_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, isselfhosted_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, SourceOrRef_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, FunctionDisplayNameOrRef_),
   };
   StackFrame_Data_reflection_ =
     new ::google::protobuf::internal::GeneratedMessageReflection(
       StackFrame_Data_descriptor_,
       StackFrame_Data::default_instance_,
       StackFrame_Data_offsets_,
       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, _has_bits_[0]),
       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, _unknown_fields_),
       -1,
+      StackFrame_Data_default_oneof_instance_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StackFrame_Data, _oneof_case_[0]),
       ::google::protobuf::DescriptorPool::generated_pool(),
       ::google::protobuf::MessageFactory::generated_factory(),
       sizeof(StackFrame_Data));
   Node_descriptor_ = file->message_type(2);
-  static const int Node_offsets_[7] = {
+  static const int Node_offsets_[11] = {
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, id_),
-    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, typename__),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Node_default_oneof_instance_, typename__),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Node_default_oneof_instance_, typenameref_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, size_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, edges_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, allocationstack_),
-    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, jsobjectclassname_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Node_default_oneof_instance_, jsobjectclassname_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Node_default_oneof_instance_, jsobjectclassnameref_),
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, coarsetype_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, TypeNameOrRef_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, JSObjectClassNameOrRef_),
   };
   Node_reflection_ =
     new ::google::protobuf::internal::GeneratedMessageReflection(
       Node_descriptor_,
       Node::default_instance_,
       Node_offsets_,
       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, _has_bits_[0]),
       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, _unknown_fields_),
       -1,
+      Node_default_oneof_instance_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, _oneof_case_[0]),
       ::google::protobuf::DescriptorPool::generated_pool(),
       ::google::protobuf::MessageFactory::generated_factory(),
       sizeof(Node));
   Edge_descriptor_ = file->message_type(3);
-  static const int Edge_offsets_[2] = {
+  static const int Edge_offsets_[4] = {
     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, referent_),
-    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, name_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Edge_default_oneof_instance_, name_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Edge_default_oneof_instance_, nameref_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, EdgeNameOrRef_),
   };
   Edge_reflection_ =
     new ::google::protobuf::internal::GeneratedMessageReflection(
       Edge_descriptor_,
       Edge::default_instance_,
       Edge_offsets_,
       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, _has_bits_[0]),
       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, _unknown_fields_),
       -1,
+      Edge_default_oneof_instance_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, _oneof_case_[0]),
       ::google::protobuf::DescriptorPool::generated_pool(),
       ::google::protobuf::MessageFactory::generated_factory(),
       sizeof(Edge));
 }
 
 namespace {
 
 GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
@@ -172,54 +204,66 @@ void protobuf_RegisterTypes(const ::std:
 
 void protobuf_ShutdownFile_CoreDump_2eproto() {
   delete Metadata::default_instance_;
   delete Metadata_reflection_;
   delete StackFrame::default_instance_;
   delete StackFrame_default_oneof_instance_;
   delete StackFrame_reflection_;
   delete StackFrame_Data::default_instance_;
+  delete StackFrame_Data_default_oneof_instance_;
   delete StackFrame_Data_reflection_;
   delete Node::default_instance_;
+  delete Node_default_oneof_instance_;
   delete Node_reflection_;
   delete Edge::default_instance_;
+  delete Edge_default_oneof_instance_;
   delete Edge_reflection_;
 }
 
 void protobuf_AddDesc_CoreDump_2eproto() {
   static bool already_here = false;
   if (already_here) return;
   already_here = true;
   GOOGLE_PROTOBUF_VERIFY_VERSION;
 
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
     "\n\016CoreDump.proto\022\031mozilla.devtools.proto"
-    "buf\"\035\n\010Metadata\022\021\n\ttimeStamp\030\001 \001(\004\"\250\002\n\nS"
+    "buf\"\035\n\010Metadata\022\021\n\ttimeStamp\030\001 \001(\004\"\216\003\n\nS"
     "tackFrame\022:\n\004data\030\001 \001(\0132*.mozilla.devtoo"
     "ls.protobuf.StackFrame.DataH\000\022\r\n\003ref\030\002 \001"
-    "(\004H\000\032\274\001\n\004Data\022\n\n\002id\030\001 \001(\004\0225\n\006parent\030\002 \001("
+    "(\004H\000\032\242\002\n\004Data\022\n\n\002id\030\001 \001(\004\0225\n\006parent\030\002 \001("
     "\0132%.mozilla.devtools.protobuf.StackFrame"
-    "\022\014\n\004line\030\003 \001(\r\022\016\n\006column\030\004 \001(\r\022\016\n\006source"
-    "\030\005 \001(\014\022\033\n\023functionDisplayName\030\006 \001(\014\022\020\n\010i"
-    "sSystem\030\007 \001(\010\022\024\n\014isSelfHosted\030\010 \001(\010B\020\n\016S"
-    "tackFrameType\"\324\001\n\004Node\022\n\n\002id\030\001 \001(\004\022\020\n\010ty"
-    "peName\030\002 \001(\014\022\014\n\004size\030\003 \001(\004\022.\n\005edges\030\004 \003("
-    "\0132\037.mozilla.devtools.protobuf.Edge\022>\n\017al"
-    "locationStack\030\005 \001(\0132%.mozilla.devtools.p"
-    "rotobuf.StackFrame\022\031\n\021jsObjectClassName\030"
-    "\006 \001(\014\022\025\n\ncoarseType\030\007 \001(\r:\0010\"&\n\004Edge\022\020\n\010"
-    "referent\030\001 \001(\004\022\014\n\004name\030\002 \001(\014", 628);
+    "\022\014\n\004line\030\003 \001(\r\022\016\n\006column\030\004 \001(\r\022\020\n\006source"
+    "\030\005 \001(\014H\000\022\023\n\tsourceRef\030\006 \001(\004H\000\022\035\n\023functio"
+    "nDisplayName\030\007 \001(\014H\001\022 \n\026functionDisplayN"
+    "ameRef\030\010 \001(\004H\001\022\020\n\010isSystem\030\t \001(\010\022\024\n\014isSe"
+    "lfHosted\030\n \001(\010B\r\n\013SourceOrRefB\032\n\030Functio"
+    "nDisplayNameOrRefB\020\n\016StackFrameType\"\272\002\n\004"
+    "Node\022\n\n\002id\030\001 \001(\004\022\022\n\010typeName\030\002 \001(\014H\000\022\025\n\013"
+    "typeNameRef\030\003 \001(\004H\000\022\014\n\004size\030\004 \001(\004\022.\n\005edg"
+    "es\030\005 \003(\0132\037.mozilla.devtools.protobuf.Edg"
+    "e\022>\n\017allocationStack\030\006 \001(\0132%.mozilla.dev"
+    "tools.protobuf.StackFrame\022\033\n\021jsObjectCla"
+    "ssName\030\007 \001(\014H\001\022\036\n\024jsObjectClassNameRef\030\010"
+    " \001(\004H\001\022\025\n\ncoarseType\030\t \001(\r:\0010B\017\n\rTypeNam"
+    "eOrRefB\030\n\026JSObjectClassNameOrRef\"L\n\004Edge"
+    "\022\020\n\010referent\030\001 \001(\004\022\016\n\004name\030\002 \001(\014H\000\022\021\n\007na"
+    "meRef\030\003 \001(\004H\000B\017\n\rEdgeNameOrRef", 870);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "CoreDump.proto", &protobuf_RegisterTypes);
   Metadata::default_instance_ = new Metadata();
   StackFrame::default_instance_ = new StackFrame();
   StackFrame_default_oneof_instance_ = new StackFrameOneofInstance;
   StackFrame_Data::default_instance_ = new StackFrame_Data();
+  StackFrame_Data_default_oneof_instance_ = new StackFrame_DataOneofInstance;
   Node::default_instance_ = new Node();
+  Node_default_oneof_instance_ = new NodeOneofInstance;
   Edge::default_instance_ = new Edge();
+  Edge_default_oneof_instance_ = new EdgeOneofInstance;
   Metadata::default_instance_->InitAsDefaultInstance();
   StackFrame::default_instance_->InitAsDefaultInstance();
   StackFrame_Data::default_instance_->InitAsDefaultInstance();
   Node::default_instance_->InitAsDefaultInstance();
   Edge::default_instance_->InitAsDefaultInstance();
   ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_CoreDump_2eproto);
 }
 
@@ -455,63 +499,69 @@ void Metadata::Swap(Metadata* other) {
 // ===================================================================
 
 #ifndef _MSC_VER
 const int StackFrame_Data::kIdFieldNumber;
 const int StackFrame_Data::kParentFieldNumber;
 const int StackFrame_Data::kLineFieldNumber;
 const int StackFrame_Data::kColumnFieldNumber;
 const int StackFrame_Data::kSourceFieldNumber;
+const int StackFrame_Data::kSourceRefFieldNumber;
 const int StackFrame_Data::kFunctionDisplayNameFieldNumber;
+const int StackFrame_Data::kFunctionDisplayNameRefFieldNumber;
 const int StackFrame_Data::kIsSystemFieldNumber;
 const int StackFrame_Data::kIsSelfHostedFieldNumber;
 #endif  // !_MSC_VER
 
 StackFrame_Data::StackFrame_Data()
   : ::google::protobuf::Message() {
   SharedCtor();
   // @@protoc_insertion_point(constructor:mozilla.devtools.protobuf.StackFrame.Data)
 }
 
 void StackFrame_Data::InitAsDefaultInstance() {
   parent_ = const_cast< ::mozilla::devtools::protobuf::StackFrame*>(&::mozilla::devtools::protobuf::StackFrame::default_instance());
+  StackFrame_Data_default_oneof_instance_->source_ = &::google::protobuf::internal::GetEmptyStringAlreadyInited();
+  StackFrame_Data_default_oneof_instance_->sourceref_ = GOOGLE_ULONGLONG(0);
+  StackFrame_Data_default_oneof_instance_->functiondisplayname_ = &::google::protobuf::internal::GetEmptyStringAlreadyInited();
+  StackFrame_Data_default_oneof_instance_->functiondisplaynameref_ = GOOGLE_ULONGLONG(0);
 }
 
 StackFrame_Data::StackFrame_Data(const StackFrame_Data& from)
   : ::google::protobuf::Message() {
   SharedCtor();
   MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:mozilla.devtools.protobuf.StackFrame.Data)
 }
 
 void StackFrame_Data::SharedCtor() {
   ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   id_ = GOOGLE_ULONGLONG(0);
   parent_ = NULL;
   line_ = 0u;
   column_ = 0u;
-  source_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  functiondisplayname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   issystem_ = false;
   isselfhosted_ = false;
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  clear_has_SourceOrRef();
+  clear_has_FunctionDisplayNameOrRef();
 }
 
 StackFrame_Data::~StackFrame_Data() {
   // @@protoc_insertion_point(destructor:mozilla.devtools.protobuf.StackFrame.Data)
   SharedDtor();
 }
 
 void StackFrame_Data::SharedDtor() {
-  if (source_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete source_;
+  if (has_SourceOrRef()) {
+    clear_SourceOrRef();
   }
-  if (functiondisplayname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete functiondisplayname_;
+  if (has_FunctionDisplayNameOrRef()) {
+    clear_FunctionDisplayNameOrRef();
   }
   if (this != default_instance_) {
     delete parent_;
   }
 }
 
 void StackFrame_Data::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
@@ -529,49 +579,76 @@ const StackFrame_Data& StackFrame_Data::
 }
 
 StackFrame_Data* StackFrame_Data::default_instance_ = NULL;
 
 StackFrame_Data* StackFrame_Data::New() const {
   return new StackFrame_Data;
 }
 
+void StackFrame_Data::clear_SourceOrRef() {
+  switch(SourceOrRef_case()) {
+    case kSource: {
+      delete SourceOrRef_.source_;
+      break;
+    }
+    case kSourceRef: {
+      // No need to clear
+      break;
+    }
+    case SOURCEORREF_NOT_SET: {
+      break;
+    }
+  }
+  _oneof_case_[0] = SOURCEORREF_NOT_SET;
+}
+
+void StackFrame_Data::clear_FunctionDisplayNameOrRef() {
+  switch(FunctionDisplayNameOrRef_case()) {
+    case kFunctionDisplayName: {
+      delete FunctionDisplayNameOrRef_.functiondisplayname_;
+      break;
+    }
+    case kFunctionDisplayNameRef: {
+      // No need to clear
+      break;
+    }
+    case FUNCTIONDISPLAYNAMEORREF_NOT_SET: {
+      break;
+    }
+  }
+  _oneof_case_[1] = FUNCTIONDISPLAYNAMEORREF_NOT_SET;
+}
+
+
 void StackFrame_Data::Clear() {
 #define OFFSET_OF_FIELD_(f) (reinterpret_cast<char*>(      \
   &reinterpret_cast<StackFrame_Data*>(16)->f) - \
    reinterpret_cast<char*>(16))
 
 #define ZR_(first, last) do {                              \
     size_t f = OFFSET_OF_FIELD_(first);                    \
     size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last);  \
     ::memset(&first, 0, n);                                \
   } while (0)
 
-  if (_has_bits_[0 / 32] & 255) {
+  if (_has_bits_[0 / 32] & 15) {
     ZR_(line_, column_);
-    ZR_(issystem_, isselfhosted_);
     id_ = GOOGLE_ULONGLONG(0);
     if (has_parent()) {
       if (parent_ != NULL) parent_->::mozilla::devtools::protobuf::StackFrame::Clear();
     }
-    if (has_source()) {
-      if (source_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-        source_->clear();
-      }
-    }
-    if (has_functiondisplayname()) {
-      if (functiondisplayname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-        functiondisplayname_->clear();
-      }
-    }
   }
+  ZR_(issystem_, isselfhosted_);
 
 #undef OFFSET_OF_FIELD_
 #undef ZR_
 
+  clear_SourceOrRef();
+  clear_FunctionDisplayNameOrRef();
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   mutable_unknown_fields()->Clear();
 }
 
 bool StackFrame_Data::MergePartialFromCodedStream(
     ::google::protobuf::io::CodedInputStream* input) {
 #define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure
   ::google::protobuf::uint32 tag;
@@ -642,51 +719,83 @@ bool StackFrame_Data::MergePartialFromCo
       case 5: {
         if (tag == 42) {
          parse_source:
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->mutable_source()));
         } else {
           goto handle_unusual;
         }
-        if (input->ExpectTag(50)) goto parse_functionDisplayName;
+        if (input->ExpectTag(48)) goto parse_sourceRef;
         break;
       }
 
-      // optional bytes functionDisplayName = 6;
+      // optional uint64 sourceRef = 6;
       case 6: {
-        if (tag == 50) {
+        if (tag == 48) {
+         parse_sourceRef:
+          clear_SourceOrRef();
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(
+                 input, &SourceOrRef_.sourceref_)));
+          set_has_sourceref();
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(58)) goto parse_functionDisplayName;
+        break;
+      }
+
+      // optional bytes functionDisplayName = 7;
+      case 7: {
+        if (tag == 58) {
          parse_functionDisplayName:
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->mutable_functiondisplayname()));
         } else {
           goto handle_unusual;
         }
-        if (input->ExpectTag(56)) goto parse_isSystem;
+        if (input->ExpectTag(64)) goto parse_functionDisplayNameRef;
         break;
       }
 
-      // optional bool isSystem = 7;
-      case 7: {
-        if (tag == 56) {
+      // optional uint64 functionDisplayNameRef = 8;
+      case 8: {
+        if (tag == 64) {
+         parse_functionDisplayNameRef:
+          clear_FunctionDisplayNameOrRef();
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(
+                 input, &FunctionDisplayNameOrRef_.functiondisplaynameref_)));
+          set_has_functiondisplaynameref();
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(72)) goto parse_isSystem;
+        break;
+      }
+
+      // optional bool isSystem = 9;
+      case 9: {
+        if (tag == 72) {
          parse_isSystem:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &issystem_)));
           set_has_issystem();
         } else {
           goto handle_unusual;
         }
-        if (input->ExpectTag(64)) goto parse_isSelfHosted;
+        if (input->ExpectTag(80)) goto parse_isSelfHosted;
         break;
       }
 
-      // optional bool isSelfHosted = 8;
-      case 8: {
-        if (tag == 64) {
+      // optional bool isSelfHosted = 10;
+      case 10: {
+        if (tag == 80) {
          parse_isSelfHosted:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &isselfhosted_)));
           set_has_isselfhosted();
         } else {
           goto handle_unusual;
         }
@@ -741,30 +850,40 @@ void StackFrame_Data::SerializeWithCache
   }
 
   // optional bytes source = 5;
   if (has_source()) {
     ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(
       5, this->source(), output);
   }
 
-  // optional bytes functionDisplayName = 6;
+  // optional uint64 sourceRef = 6;
+  if (has_sourceref()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt64(6, this->sourceref(), output);
+  }
+
+  // optional bytes functionDisplayName = 7;
   if (has_functiondisplayname()) {
     ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(
-      6, this->functiondisplayname(), output);
+      7, this->functiondisplayname(), output);
   }
 
-  // optional bool isSystem = 7;
-  if (has_issystem()) {
-    ::google::protobuf::internal::WireFormatLite::WriteBool(7, this->issystem(), output);
+  // optional uint64 functionDisplayNameRef = 8;
+  if (has_functiondisplaynameref()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt64(8, this->functiondisplaynameref(), output);
   }
 
-  // optional bool isSelfHosted = 8;
+  // optional bool isSystem = 9;
+  if (has_issystem()) {
+    ::google::protobuf::internal::WireFormatLite::WriteBool(9, this->issystem(), output);
+  }
+
+  // optional bool isSelfHosted = 10;
   if (has_isselfhosted()) {
-    ::google::protobuf::internal::WireFormatLite::WriteBool(8, this->isselfhosted(), output);
+    ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->isselfhosted(), output);
   }
 
   if (!unknown_fields().empty()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
         unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:mozilla.devtools.protobuf.StackFrame.Data)
 }
@@ -796,31 +915,41 @@ void StackFrame_Data::SerializeWithCache
 
   // optional bytes source = 5;
   if (has_source()) {
     target =
       ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(
         5, this->source(), target);
   }
 
-  // optional bytes functionDisplayName = 6;
+  // optional uint64 sourceRef = 6;
+  if (has_sourceref()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(6, this->sourceref(), target);
+  }
+
+  // optional bytes functionDisplayName = 7;
   if (has_functiondisplayname()) {
     target =
       ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(
-        6, this->functiondisplayname(), target);
+        7, this->functiondisplayname(), target);
+  }
+
+  // optional uint64 functionDisplayNameRef = 8;
+  if (has_functiondisplaynameref()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(8, this->functiondisplaynameref(), target);
   }
 
-  // optional bool isSystem = 7;
+  // optional bool isSystem = 9;
   if (has_issystem()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(7, this->issystem(), target);
+    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(9, this->issystem(), target);
   }
 
-  // optional bool isSelfHosted = 8;
+  // optional bool isSelfHosted = 10;
   if (has_isselfhosted()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(8, this->isselfhosted(), target);
+    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->isselfhosted(), target);
   }
 
   if (!unknown_fields().empty()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
         unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:mozilla.devtools.protobuf.StackFrame.Data)
   return target;
@@ -853,41 +982,67 @@ int StackFrame_Data::ByteSize() const {
 
     // optional uint32 column = 4;
     if (has_column()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::UInt32Size(
           this->column());
     }
 
-    // optional bytes source = 5;
-    if (has_source()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::BytesSize(
-          this->source());
-    }
-
-    // optional bytes functionDisplayName = 6;
-    if (has_functiondisplayname()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::BytesSize(
-          this->functiondisplayname());
-    }
-
-    // optional bool isSystem = 7;
+  }
+  if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) {
+    // optional bool isSystem = 9;
     if (has_issystem()) {
       total_size += 1 + 1;
     }
 
-    // optional bool isSelfHosted = 8;
+    // optional bool isSelfHosted = 10;
     if (has_isselfhosted()) {
       total_size += 1 + 1;
     }
 
   }
+  switch (SourceOrRef_case()) {
+    // optional bytes source = 5;
+    case kSource: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::BytesSize(
+          this->source());
+      break;
+    }
+    // optional uint64 sourceRef = 6;
+    case kSourceRef: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt64Size(
+          this->sourceref());
+      break;
+    }
+    case SOURCEORREF_NOT_SET: {
+      break;
+    }
+  }
+  switch (FunctionDisplayNameOrRef_case()) {
+    // optional bytes functionDisplayName = 7;
+    case kFunctionDisplayName: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::BytesSize(
+          this->functiondisplayname());
+      break;
+    }
+    // optional uint64 functionDisplayNameRef = 8;
+    case kFunctionDisplayNameRef: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt64Size(
+          this->functiondisplaynameref());
+      break;
+    }
+    case FUNCTIONDISPLAYNAMEORREF_NOT_SET: {
+      break;
+    }
+  }
   if (!unknown_fields().empty()) {
     total_size +=
       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
         unknown_fields());
   }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
@@ -903,35 +1058,57 @@ void StackFrame_Data::MergeFrom(const ::
     ::google::protobuf::internal::ReflectionOps::Merge(from, this);
   } else {
     MergeFrom(*source);
   }
 }
 
 void StackFrame_Data::MergeFrom(const StackFrame_Data& from) {
   GOOGLE_CHECK_NE(&from, this);
+  switch (from.SourceOrRef_case()) {
+    case kSource: {
+      set_source(from.source());
+      break;
+    }
+    case kSourceRef: {
+      set_sourceref(from.sourceref());
+      break;
+    }
+    case SOURCEORREF_NOT_SET: {
+      break;
+    }
+  }
+  switch (from.FunctionDisplayNameOrRef_case()) {
+    case kFunctionDisplayName: {
+      set_functiondisplayname(from.functiondisplayname());
+      break;
+    }
+    case kFunctionDisplayNameRef: {
+      set_functiondisplaynameref(from.functiondisplaynameref());
+      break;
+    }
+    case FUNCTIONDISPLAYNAMEORREF_NOT_SET: {
+      break;
+    }
+  }
   if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
     if (from.has_id()) {
       set_id(from.id());
     }
     if (from.has_parent()) {
       mutable_parent()->::mozilla::devtools::protobuf::StackFrame::MergeFrom(from.parent());
     }
     if (from.has_line()) {
       set_line(from.line());
     }
     if (from.has_column()) {
       set_column(from.column());
     }
-    if (from.has_source()) {
-      set_source(from.source());
-    }
-    if (from.has_functiondisplayname()) {
-      set_functiondisplayname(from.functiondisplayname());
-    }
+  }
+  if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) {
     if (from.has_issystem()) {
       set_issystem(from.issystem());
     }
     if (from.has_isselfhosted()) {
       set_isselfhosted(from.isselfhosted());
     }
   }
   mutable_unknown_fields()->MergeFrom(from.unknown_fields());
@@ -955,20 +1132,22 @@ bool StackFrame_Data::IsInitialized() co
 }
 
 void StackFrame_Data::Swap(StackFrame_Data* other) {
   if (other != this) {
     std::swap(id_, other->id_);
     std::swap(parent_, other->parent_);
     std::swap(line_, other->line_);
     std::swap(column_, other->column_);
-    std::swap(source_, other->source_);
-    std::swap(functiondisplayname_, other->functiondisplayname_);
     std::swap(issystem_, other->issystem_);
     std::swap(isselfhosted_, other->isselfhosted_);
+    std::swap(SourceOrRef_, other->SourceOrRef_);
+    std::swap(_oneof_case_[0], other->_oneof_case_[0]);
+    std::swap(FunctionDisplayNameOrRef_, other->FunctionDisplayNameOrRef_);
+    std::swap(_oneof_case_[1], other->_oneof_case_[1]);
     std::swap(_has_bits_[0], other->_has_bits_[0]);
     _unknown_fields_.Swap(&other->_unknown_fields_);
     std::swap(_cached_size_, other->_cached_size_);
   }
 }
 
 ::google::protobuf::Metadata StackFrame_Data::GetMetadata() const {
   protobuf_AssignDescriptorsOnce();
@@ -1271,63 +1450,69 @@ void StackFrame::Swap(StackFrame* other)
 }
 
 
 // ===================================================================
 
 #ifndef _MSC_VER
 const int Node::kIdFieldNumber;
 const int Node::kTypeNameFieldNumber;
+const int Node::kTypeNameRefFieldNumber;
 const int Node::kSizeFieldNumber;
 const int Node::kEdgesFieldNumber;
 const int Node::kAllocationStackFieldNumber;
 const int Node::kJsObjectClassNameFieldNumber;
+const int Node::kJsObjectClassNameRefFieldNumber;
 const int Node::kCoarseTypeFieldNumber;
 #endif  // !_MSC_VER
 
 Node::Node()
   : ::google::protobuf::Message() {
   SharedCtor();
   // @@protoc_insertion_point(constructor:mozilla.devtools.protobuf.Node)
 }
 
 void Node::InitAsDefaultInstance() {
+  Node_default_oneof_instance_->typename__ = &::google::protobuf::internal::GetEmptyStringAlreadyInited();
+  Node_default_oneof_instance_->typenameref_ = GOOGLE_ULONGLONG(0);
   allocationstack_ = const_cast< ::mozilla::devtools::protobuf::StackFrame*>(&::mozilla::devtools::protobuf::StackFrame::default_instance());
+  Node_default_oneof_instance_->jsobjectclassname_ = &::google::protobuf::internal::GetEmptyStringAlreadyInited();
+  Node_default_oneof_instance_->jsobjectclassnameref_ = GOOGLE_ULONGLONG(0);
 }
 
 Node::Node(const Node& from)
   : ::google::protobuf::Message() {
   SharedCtor();
   MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:mozilla.devtools.protobuf.Node)
 }
 
 void Node::SharedCtor() {
   ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   id_ = GOOGLE_ULONGLONG(0);
-  typename__ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   size_ = GOOGLE_ULONGLONG(0);
   allocationstack_ = NULL;
-  jsobjectclassname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   coarsetype_ = 0u;
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  clear_has_TypeNameOrRef();
+  clear_has_JSObjectClassNameOrRef();
 }
 
 Node::~Node() {
   // @@protoc_insertion_point(destructor:mozilla.devtools.protobuf.Node)
   SharedDtor();
 }
 
 void Node::SharedDtor() {
-  if (typename__ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete typename__;
+  if (has_TypeNameOrRef()) {
+    clear_TypeNameOrRef();
   }
-  if (jsobjectclassname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete jsobjectclassname_;
+  if (has_JSObjectClassNameOrRef()) {
+    clear_JSObjectClassNameOrRef();
   }
   if (this != default_instance_) {
     delete allocationstack_;
   }
 }
 
 void Node::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
@@ -1345,36 +1530,76 @@ const Node& Node::default_instance() {
 }
 
 Node* Node::default_instance_ = NULL;
 
 Node* Node::New() const {
   return new Node;
 }
 
+void Node::clear_TypeNameOrRef() {
+  switch(TypeNameOrRef_case()) {
+    case kTypeName: {
+      delete TypeNameOrRef_.typename__;
+      break;
+    }
+    case kTypeNameRef: {
+      // No need to clear
+      break;
+    }
+    case TYPENAMEORREF_NOT_SET: {
+      break;
+    }
+  }
+  _oneof_case_[0] = TYPENAMEORREF_NOT_SET;
+}
+
+void Node::clear_JSObjectClassNameOrRef() {
+  switch(JSObjectClassNameOrRef_case()) {
+    case kJsObjectClassName: {
+      delete JSObjectClassNameOrRef_.jsobjectclassname_;
+      break;
+    }
+    case kJsObjectClassNameRef: {
+      // No need to clear
+      break;
+    }
+    case JSOBJECTCLASSNAMEORREF_NOT_SET: {
+      break;
+    }
+  }
+  _oneof_case_[1] = JSOBJECTCLASSNAMEORREF_NOT_SET;
+}
+
+
 void Node::Clear() {
-  if (_has_bits_[0 / 32] & 119) {
-    id_ = GOOGLE_ULONGLONG(0);
-    if (has_typename_()) {
-      if (typename__ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-        typename__->clear();
-      }
-    }
-    size_ = GOOGLE_ULONGLONG(0);
+#define OFFSET_OF_FIELD_(f) (reinterpret_cast<char*>(      \
+  &reinterpret_cast<Node*>(16)->f) - \
+   reinterpret_cast<char*>(16))
+
+#define ZR_(first, last) do {                              \
+    size_t f = OFFSET_OF_FIELD_(first);                    \
+    size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last);  \
+    ::memset(&first, 0, n);                                \
+  } while (0)
+
+  if (_has_bits_[0 / 32] & 41) {
+    ZR_(id_, size_);
     if (has_allocationstack()) {
       if (allocationstack_ != NULL) allocationstack_->::mozilla::devtools::protobuf::StackFrame::Clear();
     }
-    if (has_jsobjectclassname()) {
-      if (jsobjectclassname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-        jsobjectclassname_->clear();
-      }
-    }
-    coarsetype_ = 0u;
   }
+  coarsetype_ = 0u;
+
+#undef OFFSET_OF_FIELD_
+#undef ZR_
+
   edges_.Clear();
+  clear_TypeNameOrRef();
+  clear_JSObjectClassNameOrRef();
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   mutable_unknown_fields()->Clear();
 }
 
 bool Node::MergePartialFromCodedStream(
     ::google::protobuf::io::CodedInputStream* input) {
 #define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure
   ::google::protobuf::uint32 tag;
@@ -1402,78 +1627,110 @@ bool Node::MergePartialFromCodedStream(
       case 2: {
         if (tag == 18) {
          parse_typeName:
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->mutable_typename_()));
         } else {
           goto handle_unusual;
         }
-        if (input->ExpectTag(24)) goto parse_size;
+        if (input->ExpectTag(24)) goto parse_typeNameRef;
         break;
       }
 
-      // optional uint64 size = 3;
+      // optional uint64 typeNameRef = 3;
       case 3: {
         if (tag == 24) {
+         parse_typeNameRef:
+          clear_TypeNameOrRef();
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(
+                 input, &TypeNameOrRef_.typenameref_)));
+          set_has_typenameref();
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(32)) goto parse_size;
+        break;
+      }
+
+      // optional uint64 size = 4;
+      case 4: {
+        if (tag == 32) {
          parse_size:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(
                  input, &size_)));
           set_has_size();
         } else {
           goto handle_unusual;
         }
-        if (input->ExpectTag(34)) goto parse_edges;
+        if (input->ExpectTag(42)) goto parse_edges;
         break;
       }
 
-      // repeated .mozilla.devtools.protobuf.Edge edges = 4;
-      case 4: {
-        if (tag == 34) {
+      // repeated .mozilla.devtools.protobuf.Edge edges = 5;
+      case 5: {
+        if (tag == 42) {
          parse_edges:
           DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                 input, add_edges()));
         } else {
           goto handle_unusual;
         }
-        if (input->ExpectTag(34)) goto parse_edges;
-        if (input->ExpectTag(42)) goto parse_allocationStack;
+        if (input->ExpectTag(42)) goto parse_edges;
+        if (input->ExpectTag(50)) goto parse_allocationStack;
         break;
       }
 
-      // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 5;
-      case 5: {
-        if (tag == 42) {
+      // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 6;
+      case 6: {
+        if (tag == 50) {
          parse_allocationStack:
           DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_allocationstack()));
         } else {
           goto handle_unusual;
         }
-        if (input->ExpectTag(50)) goto parse_jsObjectClassName;
+        if (input->ExpectTag(58)) goto parse_jsObjectClassName;
         break;
       }
 
-      // optional bytes jsObjectClassName = 6;
-      case 6: {
-        if (tag == 50) {
+      // optional bytes jsObjectClassName = 7;
+      case 7: {
+        if (tag == 58) {
          parse_jsObjectClassName:
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->mutable_jsobjectclassname()));
         } else {
           goto handle_unusual;
         }
-        if (input->ExpectTag(56)) goto parse_coarseType;
+        if (input->ExpectTag(64)) goto parse_jsObjectClassNameRef;
         break;
       }
 
-      // optional uint32 coarseType = 7 [default = 0];
-      case 7: {
-        if (tag == 56) {
+      // optional uint64 jsObjectClassNameRef = 8;
+      case 8: {
+        if (tag == 64) {
+         parse_jsObjectClassNameRef:
+          clear_JSObjectClassNameOrRef();
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(
+                 input, &JSObjectClassNameOrRef_.jsobjectclassnameref_)));
+          set_has_jsobjectclassnameref();
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(72)) goto parse_coarseType;
+        break;
+      }
+
+      // optional uint32 coarseType = 9 [default = 0];
+      case 9: {
+        if (tag == 72) {
          parse_coarseType:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
                  input, &coarsetype_)));
           set_has_coarsetype();
         } else {
           goto handle_unusual;
         }
@@ -1512,42 +1769,52 @@ void Node::SerializeWithCachedSizes(
   }
 
   // optional bytes typeName = 2;
   if (has_typename_()) {
     ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(
       2, this->typename_(), output);
   }
 
-  // optional uint64 size = 3;
-  if (has_size()) {
-    ::google::protobuf::internal::WireFormatLite::WriteUInt64(3, this->size(), output);
+  // optional uint64 typeNameRef = 3;
+  if (has_typenameref()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt64(3, this->typenameref(), output);
   }
 
-  // repeated .mozilla.devtools.protobuf.Edge edges = 4;
+  // optional uint64 size = 4;
+  if (has_size()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt64(4, this->size(), output);
+  }
+
+  // repeated .mozilla.devtools.protobuf.Edge edges = 5;
   for (int i = 0; i < this->edges_size(); i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      4, this->edges(i), output);
+      5, this->edges(i), output);
   }
 
-  // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 5;
+  // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 6;
   if (has_allocationstack()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      5, this->allocationstack(), output);
+      6, this->allocationstack(), output);
   }
 
-  // optional bytes jsObjectClassName = 6;
+  // optional bytes jsObjectClassName = 7;
   if (has_jsobjectclassname()) {
     ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(
-      6, this->jsobjectclassname(), output);
+      7, this->jsobjectclassname(), output);
   }
 
-  // optional uint32 coarseType = 7 [default = 0];
+  // optional uint64 jsObjectClassNameRef = 8;
+  if (has_jsobjectclassnameref()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt64(8, this->jsobjectclassnameref(), output);
+  }
+
+  // optional uint32 coarseType = 9 [default = 0];
   if (has_coarsetype()) {
-    ::google::protobuf::internal::WireFormatLite::WriteUInt32(7, this->coarsetype(), output);
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(9, this->coarsetype(), output);
   }
 
   if (!unknown_fields().empty()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
         unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:mozilla.devtools.protobuf.Node)
 }
@@ -1562,45 +1829,55 @@ void Node::SerializeWithCachedSizes(
 
   // optional bytes typeName = 2;
   if (has_typename_()) {
     target =
       ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(
         2, this->typename_(), target);
   }
 
-  // optional uint64 size = 3;
-  if (has_size()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(3, this->size(), target);
+  // optional uint64 typeNameRef = 3;
+  if (has_typenameref()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(3, this->typenameref(), target);
   }
 
-  // repeated .mozilla.devtools.protobuf.Edge edges = 4;
+  // optional uint64 size = 4;
+  if (has_size()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(4, this->size(), target);
+  }
+
+  // repeated .mozilla.devtools.protobuf.Edge edges = 5;
   for (int i = 0; i < this->edges_size(); i++) {
     target = ::google::protobuf::internal::WireFormatLite::
       WriteMessageNoVirtualToArray(
-        4, this->edges(i), target);
+        5, this->edges(i), target);
   }
 
-  // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 5;
+  // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 6;
   if (has_allocationstack()) {
     target = ::google::protobuf::internal::WireFormatLite::
       WriteMessageNoVirtualToArray(
-        5, this->allocationstack(), target);
+        6, this->allocationstack(), target);
   }
 
-  // optional bytes jsObjectClassName = 6;
+  // optional bytes jsObjectClassName = 7;
   if (has_jsobjectclassname()) {
     target =
       ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(
-        6, this->jsobjectclassname(), target);
+        7, this->jsobjectclassname(), target);
   }
 
-  // optional uint32 coarseType = 7 [default = 0];
+  // optional uint64 jsObjectClassNameRef = 8;
+  if (has_jsobjectclassnameref()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(8, this->jsobjectclassnameref(), target);
+  }
+
+  // optional uint32 coarseType = 9 [default = 0];
   if (has_coarsetype()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(7, this->coarsetype(), target);
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(9, this->coarsetype(), target);
   }
 
   if (!unknown_fields().empty()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
         unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:mozilla.devtools.protobuf.Node)
   return target;
@@ -1612,60 +1889,86 @@ int Node::ByteSize() const {
   if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
     // optional uint64 id = 1;
     if (has_id()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::UInt64Size(
           this->id());
     }
 
-    // optional bytes typeName = 2;
-    if (has_typename_()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::BytesSize(
-          this->typename_());
-    }
-
-    // optional uint64 size = 3;
+    // optional uint64 size = 4;
     if (has_size()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::UInt64Size(
           this->size());
     }
 
-    // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 5;
+    // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 6;
     if (has_allocationstack()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
           this->allocationstack());
     }
 
-    // optional bytes jsObjectClassName = 6;
-    if (has_jsobjectclassname()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::BytesSize(
-          this->jsobjectclassname());
-    }
-
-    // optional uint32 coarseType = 7 [default = 0];
+  }
+  if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) {
+    // optional uint32 coarseType = 9 [default = 0];
     if (has_coarsetype()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::UInt32Size(
           this->coarsetype());
     }
 
   }
-  // repeated .mozilla.devtools.protobuf.Edge edges = 4;
+  // repeated .mozilla.devtools.protobuf.Edge edges = 5;
   total_size += 1 * this->edges_size();
   for (int i = 0; i < this->edges_size(); i++) {
     total_size +=
       ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
         this->edges(i));
   }
 
+  switch (TypeNameOrRef_case()) {
+    // optional bytes typeName = 2;
+    case kTypeName: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::BytesSize(
+          this->typename_());
+      break;
+    }
+    // optional uint64 typeNameRef = 3;
+    case kTypeNameRef: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt64Size(
+          this->typenameref());
+      break;
+    }
+    case TYPENAMEORREF_NOT_SET: {
+      break;
+    }
+  }
+  switch (JSObjectClassNameOrRef_case()) {
+    // optional bytes jsObjectClassName = 7;
+    case kJsObjectClassName: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::BytesSize(
+          this->jsobjectclassname());
+      break;
+    }
+    // optional uint64 jsObjectClassNameRef = 8;
+    case kJsObjectClassNameRef: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt64Size(
+          this->jsobjectclassnameref());
+      break;
+    }
+    case JSOBJECTCLASSNAMEORREF_NOT_SET: {
+      break;
+    }
+  }
   if (!unknown_fields().empty()) {
     total_size +=
       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
         unknown_fields());
   }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
@@ -1682,32 +1985,54 @@ void Node::MergeFrom(const ::google::pro
   } else {
     MergeFrom(*source);
   }
 }
 
 void Node::MergeFrom(const Node& from) {
   GOOGLE_CHECK_NE(&from, this);
   edges_.MergeFrom(from.edges_);
+  switch (from.TypeNameOrRef_case()) {
+    case kTypeName: {
+      set_typename_(from.typename_());
+      break;
+    }
+    case kTypeNameRef: {
+      set_typenameref(from.typenameref());
+      break;
+    }
+    case TYPENAMEORREF_NOT_SET: {
+      break;
+    }
+  }
+  switch (from.JSObjectClassNameOrRef_case()) {
+    case kJsObjectClassName: {
+      set_jsobjectclassname(from.jsobjectclassname());
+      break;
+    }
+    case kJsObjectClassNameRef: {
+      set_jsobjectclassnameref(from.jsobjectclassnameref());
+      break;
+    }
+    case JSOBJECTCLASSNAMEORREF_NOT_SET: {
+      break;
+    }
+  }
   if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
     if (from.has_id()) {
       set_id(from.id());
     }
-    if (from.has_typename_()) {
-      set_typename_(from.typename_());
-    }
     if (from.has_size()) {
       set_size(from.size());
     }
     if (from.has_allocationstack()) {
       mutable_allocationstack()->::mozilla::devtools::protobuf::StackFrame::MergeFrom(from.allocationstack());
     }
-    if (from.has_jsobjectclassname()) {
-      set_jsobjectclassname(from.jsobjectclassname());
-    }
+  }
+  if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) {
     if (from.has_coarsetype()) {
       set_coarsetype(from.coarsetype());
     }
   }
   mutable_unknown_fields()->MergeFrom(from.unknown_fields());
 }
 
 void Node::CopyFrom(const ::google::protobuf::Message& from) {
@@ -1725,22 +2050,24 @@ void Node::CopyFrom(const Node& from) {
 bool Node::IsInitialized() const {
 
   return true;
 }
 
 void Node::Swap(Node* other) {
   if (other != this) {
     std::swap(id_, other->id_);
-    std::swap(typename__, other->typename__);
     std::swap(size_, other->size_);
     edges_.Swap(&other->edges_);
     std::swap(allocationstack_, other->allocationstack_);
-    std::swap(jsobjectclassname_, other->jsobjectclassname_);
     std::swap(coarsetype_, other->coarsetype_);
+    std::swap(TypeNameOrRef_, other->TypeNameOrRef_);
+    std::swap(_oneof_case_[0], other->_oneof_case_[0]);
+    std::swap(JSObjectClassNameOrRef_, other->JSObjectClassNameOrRef_);
+    std::swap(_oneof_case_[1], other->_oneof_case_[1]);
     std::swap(_has_bits_[0], other->_has_bits_[0]);
     _unknown_fields_.Swap(&other->_unknown_fields_);
     std::swap(_cached_size_, other->_cached_size_);
   }
 }
 
 ::google::protobuf::Metadata Node::GetMetadata() const {
   protobuf_AssignDescriptorsOnce();
@@ -1751,50 +2078,53 @@ void Node::Swap(Node* other) {
 }
 
 
 // ===================================================================
 
 #ifndef _MSC_VER
 const int Edge::kReferentFieldNumber;
 const int Edge::kNameFieldNumber;
+const int Edge::kNameRefFieldNumber;
 #endif  // !_MSC_VER
 
 Edge::Edge()
   : ::google::protobuf::Message() {
   SharedCtor();
   // @@protoc_insertion_point(constructor:mozilla.devtools.protobuf.Edge)
 }
 
 void Edge::InitAsDefaultInstance() {
+  Edge_default_oneof_instance_->name_ = &::google::protobuf::internal::GetEmptyStringAlreadyInited();
+  Edge_default_oneof_instance_->nameref_ = GOOGLE_ULONGLONG(0);
 }
 
 Edge::Edge(const Edge& from)
   : ::google::protobuf::Message() {
   SharedCtor();
   MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:mozilla.devtools.protobuf.Edge)
 }
 
 void Edge::SharedCtor() {
   ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   referent_ = GOOGLE_ULONGLONG(0);
-  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  clear_has_EdgeNameOrRef();
 }
 
 Edge::~Edge() {
   // @@protoc_insertion_point(destructor:mozilla.devtools.protobuf.Edge)
   SharedDtor();
 }
 
 void Edge::SharedDtor() {
-  if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete name_;
+  if (has_EdgeNameOrRef()) {
+    clear_EdgeNameOrRef();
   }
   if (this != default_instance_) {
   }
 }
 
 void Edge::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
@@ -1811,25 +2141,37 @@ const Edge& Edge::default_instance() {
 }
 
 Edge* Edge::default_instance_ = NULL;
 
 Edge* Edge::New() const {
   return new Edge;
 }
 
-void Edge::Clear() {
-  if (_has_bits_[0 / 32] & 3) {
-    referent_ = GOOGLE_ULONGLONG(0);
-    if (has_name()) {
-      if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-        name_->clear();
-      }
+void Edge::clear_EdgeNameOrRef() {
+  switch(EdgeNameOrRef_case()) {
+    case kName: {
+      delete EdgeNameOrRef_.name_;
+      break;
+    }
+    case kNameRef: {
+      // No need to clear
+      break;
+    }
+    case EDGENAMEORREF_NOT_SET: {
+      break;
     }
   }
+  _oneof_case_[0] = EDGENAMEORREF_NOT_SET;
+}
+
+
+void Edge::Clear() {
+  referent_ = GOOGLE_ULONGLONG(0);
+  clear_EdgeNameOrRef();
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   mutable_unknown_fields()->Clear();
 }
 
 bool Edge::MergePartialFromCodedStream(
     ::google::protobuf::io::CodedInputStream* input) {
 #define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure
   ::google::protobuf::uint32 tag;
@@ -1857,16 +2199,32 @@ bool Edge::MergePartialFromCodedStream(
       case 2: {
         if (tag == 18) {
          parse_name:
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->mutable_name()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(24)) goto parse_nameRef;
+        break;
+      }
+
+      // optional uint64 nameRef = 3;
+      case 3: {
+        if (tag == 24) {
+         parse_nameRef:
+          clear_EdgeNameOrRef();
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(
+                 input, &EdgeNameOrRef_.nameref_)));
+          set_has_nameref();
+        } else {
+          goto handle_unusual;
+        }
         if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
         if (tag == 0 ||
             ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
@@ -1897,16 +2255,21 @@ void Edge::SerializeWithCachedSizes(
   }
 
   // optional bytes name = 2;
   if (has_name()) {
     ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(
       2, this->name(), output);
   }
 
+  // optional uint64 nameRef = 3;
+  if (has_nameref()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt64(3, this->nameref(), output);
+  }
+
   if (!unknown_fields().empty()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
         unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:mozilla.devtools.protobuf.Edge)
 }
 
 ::google::protobuf::uint8* Edge::SerializeWithCachedSizesToArray(
@@ -1919,16 +2282,21 @@ void Edge::SerializeWithCachedSizes(
 
   // optional bytes name = 2;
   if (has_name()) {
     target =
       ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(
         2, this->name(), target);
   }
 
+  // optional uint64 nameRef = 3;
+  if (has_nameref()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(3, this->nameref(), target);
+  }
+
   if (!unknown_fields().empty()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
         unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:mozilla.devtools.protobuf.Edge)
   return target;
 }
 
@@ -1938,23 +2306,35 @@ int Edge::ByteSize() const {
   if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
     // optional uint64 referent = 1;
     if (has_referent()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::UInt64Size(
           this->referent());
     }
 
+  }
+  switch (EdgeNameOrRef_case()) {
     // optional bytes name = 2;
-    if (has_name()) {
+    case kName: {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::BytesSize(
           this->name());
+      break;
     }
-
+    // optional uint64 nameRef = 3;
+    case kNameRef: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt64Size(
+          this->nameref());
+      break;
+    }
+    case EDGENAMEORREF_NOT_SET: {
+      break;
+    }
   }
   if (!unknown_fields().empty()) {
     total_size +=
       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
         unknown_fields());
   }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = total_size;
@@ -1971,23 +2351,33 @@ void Edge::MergeFrom(const ::google::pro
     ::google::protobuf::internal::ReflectionOps::Merge(from, this);
   } else {
     MergeFrom(*source);
   }
 }
 
 void Edge::MergeFrom(const Edge& from) {
   GOOGLE_CHECK_NE(&from, this);
+  switch (from.EdgeNameOrRef_case()) {
+    case kName: {
+      set_name(from.name());
+      break;
+    }
+    case kNameRef: {
+      set_nameref(from.nameref());
+      break;
+    }
+    case EDGENAMEORREF_NOT_SET: {
+      break;
+    }
+  }
   if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
     if (from.has_referent()) {
       set_referent(from.referent());
     }
-    if (from.has_name()) {
-      set_name(from.name());
-    }
   }
   mutable_unknown_fields()->MergeFrom(from.unknown_fields());
 }
 
 void Edge::CopyFrom(const ::google::protobuf::Message& from) {
   if (&from == this) return;
   Clear();
   MergeFrom(from);
@@ -2002,17 +2392,18 @@ void Edge::CopyFrom(const Edge& from) {
 bool Edge::IsInitialized() const {
 
   return true;
 }
 
 void Edge::Swap(Edge* other) {
   if (other != this) {
     std::swap(referent_, other->referent_);
-    std::swap(name_, other->name_);
+    std::swap(EdgeNameOrRef_, other->EdgeNameOrRef_);
+    std::swap(_oneof_case_[0], other->_oneof_case_[0]);
     std::swap(_has_bits_[0], other->_has_bits_[0]);
     _unknown_fields_.Swap(&other->_unknown_fields_);
     std::swap(_cached_size_, other->_cached_size_);
   }
 }
 
 ::google::protobuf::Metadata Edge::GetMetadata() const {
   protobuf_AssignDescriptorsOnce();
--- a/devtools/shared/heapsnapshot/CoreDump.pb.h
+++ b/devtools/shared/heapsnapshot/CoreDump.pb.h
@@ -140,16 +140,28 @@ class StackFrame_Data : public ::google:
 
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return &_unknown_fields_;
   }
 
   static const ::google::protobuf::Descriptor* descriptor();
   static const StackFrame_Data& default_instance();
 
+  enum SourceOrRefCase {
+    kSource = 5,
+    kSourceRef = 6,
+    SOURCEORREF_NOT_SET = 0,
+  };
+
+  enum FunctionDisplayNameOrRefCase {
+    kFunctionDisplayName = 7,
+    kFunctionDisplayNameRef = 8,
+    FUNCTIONDISPLAYNAMEORREF_NOT_SET = 0,
+  };
+
   void Swap(StackFrame_Data* other);
 
   // implements Message ----------------------------------------------
 
   StackFrame_Data* New() const;
   void CopyFrom(const ::google::protobuf::Message& from);
   void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const StackFrame_Data& from);
@@ -212,73 +224,105 @@ class StackFrame_Data : public ::google:
   inline const ::std::string& source() const;
   inline void set_source(const ::std::string& value);
   inline void set_source(const char* value);
   inline void set_source(const void* value, size_t size);
   inline ::std::string* mutable_source();
   inline ::std::string* release_source();
   inline void set_allocated_source(::std::string* source);
 
-  // optional bytes functionDisplayName = 6;
+  // optional uint64 sourceRef = 6;
+  inline bool has_sourceref() const;
+  inline void clear_sourceref();
+  static const int kSourceRefFieldNumber = 6;
+  inline ::google::protobuf::uint64 sourceref() const;
+  inline void set_sourceref(::google::protobuf::uint64 value);
+
+  // optional bytes functionDisplayName = 7;
   inline bool has_functiondisplayname() const;
   inline void clear_functiondisplayname();
-  static const int kFunctionDisplayNameFieldNumber = 6;
+  static const int kFunctionDisplayNameFieldNumber = 7;
   inline const ::std::string& functiondisplayname() const;
   inline void set_functiondisplayname(const ::std::string& value);
   inline void set_functiondisplayname(const char* value);
   inline void set_functiondisplayname(const void* value, size_t size);
   inline ::std::string* mutable_functiondisplayname();
   inline ::std::string* release_functiondisplayname();
   inline void set_allocated_functiondisplayname(::std::string* functiondisplayname);
 
-  // optional bool isSystem = 7;
+  // optional uint64 functionDisplayNameRef = 8;
+  inline bool has_functiondisplaynameref() const;
+  inline void clear_functiondisplaynameref();
+  static const int kFunctionDisplayNameRefFieldNumber = 8;
+  inline ::google::protobuf::uint64 functiondisplaynameref() const;
+  inline void set_functiondisplaynameref(::google::protobuf::uint64 value);
+
+  // optional bool isSystem = 9;
   inline bool has_issystem() const;
   inline void clear_issystem();
-  static const int kIsSystemFieldNumber = 7;
+  static const int kIsSystemFieldNumber = 9;
   inline bool issystem() const;
   inline void set_issystem(bool value);
 
-  // optional bool isSelfHosted = 8;
+  // optional bool isSelfHosted = 10;
   inline bool has_isselfhosted() const;
   inline void clear_isselfhosted();
-  static const int kIsSelfHostedFieldNumber = 8;
+  static const int kIsSelfHostedFieldNumber = 10;
   inline bool isselfhosted() const;
   inline void set_isselfhosted(bool value);
 
+  inline SourceOrRefCase SourceOrRef_case() const;
+  inline FunctionDisplayNameOrRefCase FunctionDisplayNameOrRef_case() const;
   // @@protoc_insertion_point(class_scope:mozilla.devtools.protobuf.StackFrame.Data)
  private:
   inline void set_has_id();
   inline void clear_has_id();
   inline void set_has_parent();
   inline void clear_has_parent();
   inline void set_has_line();
   inline void clear_has_line();
   inline void set_has_column();
   inline void clear_has_column();
   inline void set_has_source();
-  inline void clear_has_source();
+  inline void set_has_sourceref();
   inline void set_has_functiondisplayname();
-  inline void clear_has_functiondisplayname();
+  inline void set_has_functiondisplaynameref();
   inline void set_has_issystem();
   inline void clear_has_issystem();
   inline void set_has_isselfhosted();
   inline void clear_has_isselfhosted();
 
+  inline bool has_SourceOrRef();
+  void clear_SourceOrRef();
+  inline void clear_has_SourceOrRef();
+
+  inline bool has_FunctionDisplayNameOrRef();
+  void clear_FunctionDisplayNameOrRef();
+  inline void clear_has_FunctionDisplayNameOrRef();
+
   ::google::protobuf::UnknownFieldSet _unknown_fields_;
 
   ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::uint64 id_;
   ::mozilla::devtools::protobuf::StackFrame* parent_;
   ::google::protobuf::uint32 line_;
   ::google::protobuf::uint32 column_;
-  ::std::string* source_;
-  ::std::string* functiondisplayname_;
   bool issystem_;
   bool isselfhosted_;
+  union SourceOrRefUnion {
+    ::std::string* source_;
+    ::google::protobuf::uint64 sourceref_;
+  } SourceOrRef_;
+  union FunctionDisplayNameOrRefUnion {
+    ::std::string* functiondisplayname_;
+    ::google::protobuf::uint64 functiondisplaynameref_;
+  } FunctionDisplayNameOrRef_;
+  ::google::protobuf::uint32 _oneof_case_[2];
+
   friend void  protobuf_AddDesc_CoreDump_2eproto();
   friend void protobuf_AssignDesc_CoreDump_2eproto();
   friend void protobuf_ShutdownFile_CoreDump_2eproto();
 
   void InitAsDefaultInstance();
   static StackFrame_Data* default_instance_;
 };
 // -------------------------------------------------------------------
@@ -407,16 +451,28 @@ class Node : public ::google::protobuf::
 
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return &_unknown_fields_;
   }
 
   static const ::google::protobuf::Descriptor* descriptor();
   static const Node& default_instance();
 
+  enum TypeNameOrRefCase {
+    kTypeName = 2,
+    kTypeNameRef = 3,
+    TYPENAMEORREF_NOT_SET = 0,
+  };
+
+  enum JSObjectClassNameOrRefCase {
+    kJsObjectClassName = 7,
+    kJsObjectClassNameRef = 8,
+    JSOBJECTCLASSNAMEORREF_NOT_SET = 0,
+  };
+
   void Swap(Node* other);
 
   // implements Message ----------------------------------------------
 
   Node* New() const;
   void CopyFrom(const ::google::protobuf::Message& from);
   void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Node& from);
@@ -456,89 +512,121 @@ class Node : public ::google::protobuf::
   inline const ::std::string& typename_() const;
   inline void set_typename_(const ::std::string& value);
   inline void set_typename_(const char* value);
   inline void set_typename_(const void* value, size_t size);
   inline ::std::string* mutable_typename_();
   inline ::std::string* release_typename_();
   inline void set_allocated_typename_(::std::string* typename_);
 
-  // optional uint64 size = 3;
+  // optional uint64 typeNameRef = 3;
+  inline bool has_typenameref() const;
+  inline void clear_typenameref();
+  static const int kTypeNameRefFieldNumber = 3;
+  inline ::google::protobuf::uint64 typenameref() const;
+  inline void set_typenameref(::google::protobuf::uint64 value);
+
+  // optional uint64 size = 4;
   inline bool has_size() const;
   inline void clear_size();
-  static const int kSizeFieldNumber = 3;
+  static const int kSizeFieldNumber = 4;
   inline ::google::protobuf::uint64 size() const;
   inline void set_size(::google::protobuf::uint64 value);
 
-  // repeated .mozilla.devtools.protobuf.Edge edges = 4;
+  // repeated .mozilla.devtools.protobuf.Edge edges = 5;
   inline int edges_size() const;
   inline void clear_edges();
-  static const int kEdgesFieldNumber = 4;
+  static const int kEdgesFieldNumber = 5;
   inline const ::mozilla::devtools::protobuf::Edge& edges(int index) const;
   inline ::mozilla::devtools::protobuf::Edge* mutable_edges(int index);
   inline ::mozilla::devtools::protobuf::Edge* add_edges();
   inline const ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge >&
       edges() const;
   inline ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge >*
       mutable_edges();
 
-  // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 5;
+  // optional .mozilla.devtools.protobuf.StackFrame allocationStack = 6;
   inline bool has_allocationstack() const;
   inline void clear_allocationstack();
-  static const int kAllocationStackFieldNumber = 5;
+  static const int kAllocationStackFieldNumber = 6;
   inline const ::mozilla::devtools::protobuf::StackFrame& allocationstack() const;
   inline ::mozilla::devtools::protobuf::StackFrame* mutable_allocationstack();
   inline ::mozilla::devtools::protobuf::StackFrame* release_allocationstack();
   inline void set_allocated_allocationstack(::mozilla::devtools::protobuf::StackFrame* allocationstack);
 
-  // optional bytes jsObjectClassName = 6;
+  // optional bytes jsObjectClassName = 7;
   inline bool has_jsobjectclassname() const;
   inline void clear_jsobjectclassname();
-  static const int kJsObjectClassNameFieldNumber = 6;
+  static const int kJsObjectClassNameFieldNumber = 7;
   inline const ::std::string& jsobjectclassname() const;
   inline void set_jsobjectclassname(const ::std::string& value);
   inline void set_jsobjectclassname(const char* value);
   inline void set_jsobjectclassname(const void* value, size_t size);
   inline ::std::string* mutable_jsobjectclassname();
   inline ::std::string* release_jsobjectclassname();
   inline void set_allocated_jsobjectclassname(::std::string* jsobjectclassname);
 
-  // optional uint32 coarseType = 7 [default = 0];
+  // optional uint64 jsObjectClassNameRef = 8;
+  inline bool has_jsobjectclassnameref() const;
+  inline void clear_jsobjectclassnameref();
+  static const int kJsObjectClassNameRefFieldNumber = 8;
+  inline ::google::protobuf::uint64 jsobjectclassnameref() const;
+  inline void set_jsobjectclassnameref(::google::protobuf::uint64 value);
+
+  // optional uint32 coarseType = 9 [default = 0];
   inline bool has_coarsetype() const;
   inline void clear_coarsetype();
-  static const int kCoarseTypeFieldNumber = 7;
+  static const int kCoarseTypeFieldNumber = 9;
   inline ::google::protobuf::uint32 coarsetype() const;
   inline void set_coarsetype(::google::protobuf::uint32 value);
 
+  inline TypeNameOrRefCase TypeNameOrRef_case() const;
+  inline JSObjectClassNameOrRefCase JSObjectClassNameOrRef_case() const;
   // @@protoc_insertion_point(class_scope:mozilla.devtools.protobuf.Node)
  private:
   inline void set_has_id();
   inline void clear_has_id();
   inline void set_has_typename_();
-  inline void clear_has_typename_();
+  inline void set_has_typenameref();
   inline void set_has_size();
   inline void clear_has_size();
   inline void set_has_allocationstack();
   inline void clear_has_allocationstack();
   inline void set_has_jsobjectclassname();
-  inline void clear_has_jsobjectclassname();
+  inline void set_has_jsobjectclassnameref();
   inline void set_has_coarsetype();
   inline void clear_has_coarsetype();
 
+  inline bool has_TypeNameOrRef();
+  void clear_TypeNameOrRef();
+  inline void clear_has_TypeNameOrRef();
+
+  inline bool has_JSObjectClassNameOrRef();
+  void clear_JSObjectClassNameOrRef();
+  inline void clear_has_JSObjectClassNameOrRef();
+
   ::google::protobuf::UnknownFieldSet _unknown_fields_;
 
   ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::uint64 id_;
-  ::std::string* typename__;
   ::google::protobuf::uint64 size_;
   ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge > edges_;
   ::mozilla::devtools::protobuf::StackFrame* allocationstack_;
-  ::std::string* jsobjectclassname_;
   ::google::protobuf::uint32 coarsetype_;
+  union TypeNameOrRefUnion {
+    ::std::string* typename__;
+    ::google::protobuf::uint64 typenameref_;
+  } TypeNameOrRef_;
+  union JSObjectClassNameOrRefUnion {
+    ::std::string* jsobjectclassname_;
+    ::google::protobuf::uint64 jsobjectclassnameref_;
+  } JSObjectClassNameOrRef_;
+  ::google::protobuf::uint32 _oneof_case_[2];
+
   friend void  protobuf_AddDesc_CoreDump_2eproto();
   friend void protobuf_AssignDesc_CoreDump_2eproto();
   friend void protobuf_ShutdownFile_CoreDump_2eproto();
 
   void InitAsDefaultInstance();
   static Node* default_instance_;
 };
 // -------------------------------------------------------------------
@@ -561,16 +649,22 @@ class Edge : public ::google::protobuf::
 
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return &_unknown_fields_;
   }
 
   static const ::google::protobuf::Descriptor* descriptor();
   static const Edge& default_instance();
 
+  enum EdgeNameOrRefCase {
+    kName = 2,
+    kNameRef = 3,
+    EDGENAMEORREF_NOT_SET = 0,
+  };
+
   void Swap(Edge* other);
 
   // implements Message ----------------------------------------------
 
   Edge* New() const;
   void CopyFrom(const ::google::protobuf::Message& from);
   void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Edge& from);
@@ -610,29 +704,46 @@ class Edge : public ::google::protobuf::
   inline const ::std::string& name() const;
   inline void set_name(const ::std::string& value);
   inline void set_name(const char* value);
   inline void set_name(const void* value, size_t size);
   inline ::std::string* mutable_name();
   inline ::std::string* release_name();
   inline void set_allocated_name(::std::string* name);
 
+  // optional uint64 nameRef = 3;
+  inline bool has_nameref() const;
+  inline void clear_nameref();
+  static const int kNameRefFieldNumber = 3;
+  inline ::google::protobuf::uint64 nameref() const;
+  inline void set_nameref(::google::protobuf::uint64 value);
+
+  inline EdgeNameOrRefCase EdgeNameOrRef_case() const;
   // @@protoc_insertion_point(class_scope:mozilla.devtools.protobuf.Edge)
  private:
   inline void set_has_referent();
   inline void clear_has_referent();
   inline void set_has_name();
-  inline void clear_has_name();
+  inline void set_has_nameref();
+
+  inline bool has_EdgeNameOrRef();
+  void clear_EdgeNameOrRef();
+  inline void clear_has_EdgeNameOrRef();
 
   ::google::protobuf::UnknownFieldSet _unknown_fields_;
 
   ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::uint64 referent_;
-  ::std::string* name_;
+  union EdgeNameOrRefUnion {
+    ::std::string* name_;
+    ::google::protobuf::uint64 nameref_;
+  } EdgeNameOrRef_;
+  ::google::protobuf::uint32 _oneof_case_[1];
+
   friend void  protobuf_AddDesc_CoreDump_2eproto();
   friend void protobuf_AssignDesc_CoreDump_2eproto();
   friend void protobuf_ShutdownFile_CoreDump_2eproto();
 
   void InitAsDefaultInstance();
   static Edge* default_instance_;
 };
 // ===================================================================
@@ -780,214 +891,274 @@ inline ::google::protobuf::uint32 StackF
 inline void StackFrame_Data::set_column(::google::protobuf::uint32 value) {
   set_has_column();
   column_ = value;
   // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.StackFrame.Data.column)
 }
 
 // optional bytes source = 5;
 inline bool StackFrame_Data::has_source() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return SourceOrRef_case() == kSource;
 }
 inline void StackFrame_Data::set_has_source() {
-  _has_bits_[0] |= 0x00000010u;
-}
-inline void StackFrame_Data::clear_has_source() {
-  _has_bits_[0] &= ~0x00000010u;
+  _oneof_case_[0] = kSource;
 }
 inline void StackFrame_Data::clear_source() {
-  if (source_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    source_->clear();
+  if (has_source()) {
+    delete SourceOrRef_.source_;
+    clear_has_SourceOrRef();
   }
-  clear_has_source();
 }
 inline const ::std::string& StackFrame_Data::source() const {
-  // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.StackFrame.Data.source)
-  return *source_;
+  if (has_source()) {
+    return *SourceOrRef_.source_;
+  }
+  return ::google::protobuf::internal::GetEmptyStringAlreadyInited();
 }
 inline void StackFrame_Data::set_source(const ::std::string& value) {
-  set_has_source();
-  if (source_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    source_ = new ::std::string;
+  if (!has_source()) {
+    clear_SourceOrRef();
+    set_has_source();
+    SourceOrRef_.source_ = new ::std::string;
   }
-  source_->assign(value);
-  // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.StackFrame.Data.source)
+  SourceOrRef_.source_->assign(value);
 }
 inline void StackFrame_Data::set_source(const char* value) {
-  set_has_source();
-  if (source_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    source_ = new ::std::string;
+  if (!has_source()) {
+    clear_SourceOrRef();
+    set_has_source();
+    SourceOrRef_.source_ = new ::std::string;
   }
-  source_->assign(value);
-  // @@protoc_insertion_point(field_set_char:mozilla.devtools.protobuf.StackFrame.Data.source)
+  SourceOrRef_.source_->assign(value);
 }
 inline void StackFrame_Data::set_source(const void* value, size_t size) {
-  set_has_source();
-  if (source_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    source_ = new ::std::string;
+  if (!has_source()) {
+    clear_SourceOrRef();
+    set_has_source();
+    SourceOrRef_.source_ = new ::std::string;
   }
-  source_->assign(reinterpret_cast<const char*>(value), size);
-  // @@protoc_insertion_point(field_set_pointer:mozilla.devtools.protobuf.StackFrame.Data.source)
+  SourceOrRef_.source_->assign(
+      reinterpret_cast<const char*>(value), size);
 }
 inline ::std::string* StackFrame_Data::mutable_source() {
-  set_has_source();
-  if (source_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    source_ = new ::std::string;
+  if (!has_source()) {
+    clear_SourceOrRef();
+    set_has_source();
+    SourceOrRef_.source_ = new ::std::string;
   }
-  // @@protoc_insertion_point(field_mutable:mozilla.devtools.protobuf.StackFrame.Data.source)
-  return source_;
+  return SourceOrRef_.source_;
 }
 inline ::std::string* StackFrame_Data::release_source() {
-  clear_has_source();
-  if (source_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    return NULL;
+  if (has_source()) {
+    clear_has_SourceOrRef();
+    ::std::string* temp = SourceOrRef_.source_;
+    SourceOrRef_.source_ = NULL;
+    return temp;
   } else {
-    ::std::string* temp = source_;
-    source_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-    return temp;
+    return NULL;
   }
 }
 inline void StackFrame_Data::set_allocated_source(::std::string* source) {
-  if (source_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete source_;
-  }
+  clear_SourceOrRef();
   if (source) {
     set_has_source();
-    source_ = source;
-  } else {
-    clear_has_source();
-    source_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    SourceOrRef_.source_ = source;
   }
-  // @@protoc_insertion_point(field_set_allocated:mozilla.devtools.protobuf.StackFrame.Data.source)
 }
 
-// optional bytes functionDisplayName = 6;
+// optional uint64 sourceRef = 6;
+inline bool StackFrame_Data::has_sourceref() const {
+  return SourceOrRef_case() == kSourceRef;
+}
+inline void StackFrame_Data::set_has_sourceref() {
+  _oneof_case_[0] = kSourceRef;
+}
+inline void StackFrame_Data::clear_sourceref() {
+  if (has_sourceref()) {
+    SourceOrRef_.sourceref_ = GOOGLE_ULONGLONG(0);
+    clear_has_SourceOrRef();
+  }
+}
+inline ::google::protobuf::uint64 StackFrame_Data::sourceref() const {
+  if (has_sourceref()) {
+    return SourceOrRef_.sourceref_;
+  }
+  return GOOGLE_ULONGLONG(0);
+}
+inline void StackFrame_Data::set_sourceref(::google::protobuf::uint64 value) {
+  if (!has_sourceref()) {
+    clear_SourceOrRef();
+    set_has_sourceref();
+  }
+  SourceOrRef_.sourceref_ = value;
+}
+
+// optional bytes functionDisplayName = 7;
 inline bool StackFrame_Data::has_functiondisplayname() const {
-  return (_has_bits_[0] & 0x00000020u) != 0;
+  return FunctionDisplayNameOrRef_case() == kFunctionDisplayName;
 }
 inline void StackFrame_Data::set_has_functiondisplayname() {
-  _has_bits_[0] |= 0x00000020u;
-}
-inline void StackFrame_Data::clear_has_functiondisplayname() {
-  _has_bits_[0] &= ~0x00000020u;
+  _oneof_case_[1] = kFunctionDisplayName;
 }
 inline void StackFrame_Data::clear_functiondisplayname() {
-  if (functiondisplayname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    functiondisplayname_->clear();
+  if (has_functiondisplayname()) {
+    delete FunctionDisplayNameOrRef_.functiondisplayname_;
+    clear_has_FunctionDisplayNameOrRef();
   }
-  clear_has_functiondisplayname();
 }
 inline const ::std::string& StackFrame_Data::functiondisplayname() const {
-  // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.StackFrame.Data.functionDisplayName)
-  return *functiondisplayname_;
+  if (has_functiondisplayname()) {
+    return *FunctionDisplayNameOrRef_.functiondisplayname_;
+  }
+  return ::google::protobuf::internal::GetEmptyStringAlreadyInited();
 }
 inline void StackFrame_Data::set_functiondisplayname(const ::std::string& value) {
-  set_has_functiondisplayname();
-  if (functiondisplayname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    functiondisplayname_ = new ::std::string;
+  if (!has_functiondisplayname()) {
+    clear_FunctionDisplayNameOrRef();
+    set_has_functiondisplayname();
+    FunctionDisplayNameOrRef_.functiondisplayname_ = new ::std::string;
   }
-  functiondisplayname_->assign(value);
-  // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.StackFrame.Data.functionDisplayName)
+  FunctionDisplayNameOrRef_.functiondisplayname_->assign(value);
 }
 inline void StackFrame_Data::set_functiondisplayname(const char* value) {
-  set_has_functiondisplayname();
-  if (functiondisplayname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    functiondisplayname_ = new ::std::string;
+  if (!has_functiondisplayname()) {
+    clear_FunctionDisplayNameOrRef();
+    set_has_functiondisplayname();
+    FunctionDisplayNameOrRef_.functiondisplayname_ = new ::std::string;
   }
-  functiondisplayname_->assign(value);
-  // @@protoc_insertion_point(field_set_char:mozilla.devtools.protobuf.StackFrame.Data.functionDisplayName)
+  FunctionDisplayNameOrRef_.functiondisplayname_->assign(value);
 }
 inline void StackFrame_Data::set_functiondisplayname(const void* value, size_t size) {
-  set_has_functiondisplayname();
-  if (functiondisplayname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    functiondisplayname_ = new ::std::string;
+  if (!has_functiondisplayname()) {
+    clear_FunctionDisplayNameOrRef();
+    set_has_functiondisplayname();
+    FunctionDisplayNameOrRef_.functiondisplayname_ = new ::std::string;
   }
-  functiondisplayname_->assign(reinterpret_cast<const char*>(value), size);
-  // @@protoc_insertion_point(field_set_pointer:mozilla.devtools.protobuf.StackFrame.Data.functionDisplayName)
+  FunctionDisplayNameOrRef_.functiondisplayname_->assign(
+      reinterpret_cast<const char*>(value), size);
 }
 inline ::std::string* StackFrame_Data::mutable_functiondisplayname() {
-  set_has_functiondisplayname();
-  if (functiondisplayname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    functiondisplayname_ = new ::std::string;
+  if (!has_functiondisplayname()) {
+    clear_FunctionDisplayNameOrRef();
+    set_has_functiondisplayname();
+    FunctionDisplayNameOrRef_.functiondisplayname_ = new ::std::string;
   }
-  // @@protoc_insertion_point(field_mutable:mozilla.devtools.protobuf.StackFrame.Data.functionDisplayName)
-  return functiondisplayname_;
+  return FunctionDisplayNameOrRef_.functiondisplayname_;
 }
 inline ::std::string* StackFrame_Data::release_functiondisplayname() {
-  clear_has_functiondisplayname();
-  if (functiondisplayname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    return NULL;
+  if (has_functiondisplayname()) {
+    clear_has_FunctionDisplayNameOrRef();
+    ::std::string* temp = FunctionDisplayNameOrRef_.functiondisplayname_;
+    FunctionDisplayNameOrRef_.functiondisplayname_ = NULL;
+    return temp;
   } else {
-    ::std::string* temp = functiondisplayname_;
-    functiondisplayname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-    return temp;
+    return NULL;
   }
 }
 inline void StackFrame_Data::set_allocated_functiondisplayname(::std::string* functiondisplayname) {
-  if (functiondisplayname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete functiondisplayname_;
-  }
+  clear_FunctionDisplayNameOrRef();
   if (functiondisplayname) {
     set_has_functiondisplayname();
-    functiondisplayname_ = functiondisplayname;
-  } else {
-    clear_has_functiondisplayname();
-    functiondisplayname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    FunctionDisplayNameOrRef_.functiondisplayname_ = functiondisplayname;
   }
-  // @@protoc_insertion_point(field_set_allocated:mozilla.devtools.protobuf.StackFrame.Data.functionDisplayName)
 }
 
-// optional bool isSystem = 7;
+// optional uint64 functionDisplayNameRef = 8;
+inline bool StackFrame_Data::has_functiondisplaynameref() const {
+  return FunctionDisplayNameOrRef_case() == kFunctionDisplayNameRef;
+}
+inline void StackFrame_Data::set_has_functiondisplaynameref() {
+  _oneof_case_[1] = kFunctionDisplayNameRef;
+}
+inline void StackFrame_Data::clear_functiondisplaynameref() {
+  if (has_functiondisplaynameref()) {
+    FunctionDisplayNameOrRef_.functiondisplaynameref_ = GOOGLE_ULONGLONG(0);
+    clear_has_FunctionDisplayNameOrRef();
+  }
+}
+inline ::google::protobuf::uint64 StackFrame_Data::functiondisplaynameref() const {
+  if (has_functiondisplaynameref()) {
+    return FunctionDisplayNameOrRef_.functiondisplaynameref_;
+  }
+  return GOOGLE_ULONGLONG(0);
+}
+inline void StackFrame_Data::set_functiondisplaynameref(::google::protobuf::uint64 value) {
+  if (!has_functiondisplaynameref()) {
+    clear_FunctionDisplayNameOrRef();
+    set_has_functiondisplaynameref();
+  }
+  FunctionDisplayNameOrRef_.functiondisplaynameref_ = value;
+}
+
+// optional bool isSystem = 9;
 inline bool StackFrame_Data::has_issystem() const {
-  return (_has_bits_[0] & 0x00000040u) != 0;
+  return (_has_bits_[0] & 0x00000100u) != 0;
 }
 inline void StackFrame_Data::set_has_issystem() {
-  _has_bits_[0] |= 0x00000040u;
+  _has_bits_[0] |= 0x00000100u;
 }
 inline void StackFrame_Data::clear_has_issystem() {
-  _has_bits_[0] &= ~0x00000040u;
+  _has_bits_[0] &= ~0x00000100u;
 }
 inline void StackFrame_Data::clear_issystem() {
   issystem_ = false;
   clear_has_issystem();
 }
 inline bool StackFrame_Data::issystem() const {
   // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.StackFrame.Data.isSystem)
   return issystem_;
 }
 inline void StackFrame_Data::set_issystem(bool value) {
   set_has_issystem();
   issystem_ = value;
   // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.StackFrame.Data.isSystem)
 }
 
-// optional bool isSelfHosted = 8;
+// optional bool isSelfHosted = 10;
 inline bool StackFrame_Data::has_isselfhosted() const {
-  return (_has_bits_[0] & 0x00000080u) != 0;
+  return (_has_bits_[0] & 0x00000200u) != 0;
 }
 inline void StackFrame_Data::set_has_isselfhosted() {
-  _has_bits_[0] |= 0x00000080u;
+  _has_bits_[0] |= 0x00000200u;
 }
 inline void StackFrame_Data::clear_has_isselfhosted() {
-  _has_bits_[0] &= ~0x00000080u;
+  _has_bits_[0] &= ~0x00000200u;
 }
 inline void StackFrame_Data::clear_isselfhosted() {
   isselfhosted_ = false;
   clear_has_isselfhosted();
 }
 inline bool StackFrame_Data::isselfhosted() const {
   // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.StackFrame.Data.isSelfHosted)
   return isselfhosted_;
 }
 inline void StackFrame_Data::set_isselfhosted(bool value) {
   set_has_isselfhosted();
   isselfhosted_ = value;
   // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.StackFrame.Data.isSelfHosted)
 }
 
+inline bool StackFrame_Data::has_SourceOrRef() {
+  return SourceOrRef_case() != SOURCEORREF_NOT_SET;
+}
+inline void StackFrame_Data::clear_has_SourceOrRef() {
+  _oneof_case_[0] = SOURCEORREF_NOT_SET;
+}
+inline bool StackFrame_Data::has_FunctionDisplayNameOrRef() {
+  return FunctionDisplayNameOrRef_case() != FUNCTIONDISPLAYNAMEORREF_NOT_SET;
+}
+inline void StackFrame_Data::clear_has_FunctionDisplayNameOrRef() {
+  _oneof_case_[1] = FUNCTIONDISPLAYNAMEORREF_NOT_SET;
+}
+inline StackFrame_Data::SourceOrRefCase StackFrame_Data::SourceOrRef_case() const {
+  return StackFrame_Data::SourceOrRefCase(_oneof_case_[0]);
+}
+inline StackFrame_Data::FunctionDisplayNameOrRefCase StackFrame_Data::FunctionDisplayNameOrRef_case() const {
+  return StackFrame_Data::FunctionDisplayNameOrRefCase(_oneof_case_[1]);
+}
 // -------------------------------------------------------------------
 
 // StackFrame
 
 // optional .mozilla.devtools.protobuf.StackFrame.Data data = 1;
 inline bool StackFrame::has_data() const {
   return StackFrameType_case() == kData;
 }
@@ -1091,115 +1262,136 @@ inline ::google::protobuf::uint64 Node::
 inline void Node::set_id(::google::protobuf::uint64 value) {
   set_has_id();
   id_ = value;
   // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Node.id)
 }
 
 // optional bytes typeName = 2;
 inline bool Node::has_typename_() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return TypeNameOrRef_case() == kTypeName;
 }
 inline void Node::set_has_typename_() {
-  _has_bits_[0] |= 0x00000002u;
-}
-inline void Node::clear_has_typename_() {
-  _has_bits_[0] &= ~0x00000002u;
+  _oneof_case_[0] = kTypeName;
 }
 inline void Node::clear_typename_() {
-  if (typename__ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    typename__->clear();
+  if (has_typename_()) {
+    delete TypeNameOrRef_.typename__;
+    clear_has_TypeNameOrRef();
   }
-  clear_has_typename_();
 }
 inline const ::std::string& Node::typename_() const {
-  // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.typeName)
-  return *typename__;
+  if (has_typename_()) {
+    return *TypeNameOrRef_.typename__;
+  }
+  return ::google::protobuf::internal::GetEmptyStringAlreadyInited();
 }
 inline void Node::set_typename_(const ::std::string& value) {
-  set_has_typename_();
-  if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    typename__ = new ::std::string;
+  if (!has_typename_()) {
+    clear_TypeNameOrRef();
+    set_has_typename_();
+    TypeNameOrRef_.typename__ = new ::std::string;
   }
-  typename__->assign(value);
-  // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Node.typeName)
+  TypeNameOrRef_.typename__->assign(value);
 }
 inline void Node::set_typename_(const char* value) {
-  set_has_typename_();
-  if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    typename__ = new ::std::string;
+  if (!has_typename_()) {
+    clear_TypeNameOrRef();
+    set_has_typename_();
+    TypeNameOrRef_.typename__ = new ::std::string;
   }
-  typename__->assign(value);
-  // @@protoc_insertion_point(field_set_char:mozilla.devtools.protobuf.Node.typeName)
+  TypeNameOrRef_.typename__->assign(value);
 }
 inline void Node::set_typename_(const void* value, size_t size) {
-  set_has_typename_();
-  if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    typename__ = new ::std::string;
+  if (!has_typename_()) {
+    clear_TypeNameOrRef();
+    set_has_typename_();
+    TypeNameOrRef_.typename__ = new ::std::string;
   }
-  typename__->assign(reinterpret_cast<const char*>(value), size);
-  // @@protoc_insertion_point(field_set_pointer:mozilla.devtools.protobuf.Node.typeName)
+  TypeNameOrRef_.typename__->assign(
+      reinterpret_cast<const char*>(value), size);
 }
 inline ::std::string* Node::mutable_typename_() {
-  set_has_typename_();
-  if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    typename__ = new ::std::string;
+  if (!has_typename_()) {
+    clear_TypeNameOrRef();
+    set_has_typename_();
+    TypeNameOrRef_.typename__ = new ::std::string;
   }
-  // @@protoc_insertion_point(field_mutable:mozilla.devtools.protobuf.Node.typeName)
-  return typename__;
+  return TypeNameOrRef_.typename__;
 }
 inline ::std::string* Node::release_typename_() {
-  clear_has_typename_();
-  if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    return NULL;
+  if (has_typename_()) {
+    clear_has_TypeNameOrRef();
+    ::std::string* temp = TypeNameOrRef_.typename__;
+    TypeNameOrRef_.typename__ = NULL;
+    return temp;
   } else {
-    ::std::string* temp = typename__;
-    typename__ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-    return temp;
+    return NULL;
   }
 }
 inline void Node::set_allocated_typename_(::std::string* typename_) {
-  if (typename__ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete typename__;
-  }
+  clear_TypeNameOrRef();
   if (typename_) {
     set_has_typename_();
-    typename__ = typename_;
-  } else {
-    clear_has_typename_();
-    typename__ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    TypeNameOrRef_.typename__ = typename_;
   }
-  // @@protoc_insertion_point(field_set_allocated:mozilla.devtools.protobuf.Node.typeName)
 }
 
-// optional uint64 size = 3;
+// optional uint64 typeNameRef = 3;
+inline bool Node::has_typenameref() const {
+  return TypeNameOrRef_case() == kTypeNameRef;
+}
+inline void Node::set_has_typenameref() {
+  _oneof_case_[0] = kTypeNameRef;
+}
+inline void Node::clear_typenameref() {
+  if (has_typenameref()) {
+    TypeNameOrRef_.typenameref_ = GOOGLE_ULONGLONG(0);
+    clear_has_TypeNameOrRef();
+  }
+}
+inline ::google::protobuf::uint64 Node::typenameref() const {
+  if (has_typenameref()) {
+    return TypeNameOrRef_.typenameref_;
+  }
+  return GOOGLE_ULONGLONG(0);
+}
+inline void Node::set_typenameref(::google::protobuf::uint64 value) {
+  if (!has_typenameref()) {
+    clear_TypeNameOrRef();
+    set_has_typenameref();
+  }
+  TypeNameOrRef_.typenameref_ = value;
+}
+
+// optional uint64 size = 4;
 inline bool Node::has_size() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 inline void Node::set_has_size() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000008u;
 }
 inline void Node::clear_has_size() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline void Node::clear_size() {
   size_ = GOOGLE_ULONGLONG(0);
   clear_has_size();
 }
 inline ::google::protobuf::uint64 Node::size() const {
   // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.size)
   return size_;
 }
 inline void Node::set_size(::google::protobuf::uint64 value) {
   set_has_size();
   size_ = value;
   // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Node.size)
 }
 
-// repeated .mozilla.devtools.protobuf.Edge edges = 4;
+// repeated .mozilla.devtools.protobuf.Edge edges = 5;
 inline int Node::edges_size() const {
   return edges_.size();
 }
 inline void Node::clear_edges() {
   edges_.Clear();
 }
 inline const ::mozilla::devtools::protobuf::Edge& Node::edges(int index) const {
   // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.edges)
@@ -1219,25 +1411,25 @@ Node::edges() const {
   return edges_;
 }
 inline ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge >*
 Node::mutable_edges() {
   // @@protoc_insertion_point(field_mutable_list:mozilla.devtools.protobuf.Node.edges)
   return &edges_;
 }
 
-// optional .mozilla.devtools.protobuf.StackFrame allocationStack = 5;
+// optional .mozilla.devtools.protobuf.StackFrame allocationStack = 6;
 inline bool Node::has_allocationstack() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return (_has_bits_[0] & 0x00000020u) != 0;
 }
 inline void Node::set_has_allocationstack() {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00000020u;
 }
 inline void Node::clear_has_allocationstack() {
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00000020u;
 }
 inline void Node::clear_allocationstack() {
   if (allocationstack_ != NULL) allocationstack_->::mozilla::devtools::protobuf::StackFrame::Clear();
   clear_has_allocationstack();
 }
 inline const ::mozilla::devtools::protobuf::StackFrame& Node::allocationstack() const {
   // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.allocationStack)
   return allocationstack_ != NULL ? *allocationstack_ : *default_instance_->allocationstack_;
@@ -1260,116 +1452,155 @@ inline void Node::set_allocated_allocati
   if (allocationstack) {
     set_has_allocationstack();
   } else {
     clear_has_allocationstack();
   }
   // @@protoc_insertion_point(field_set_allocated:mozilla.devtools.protobuf.Node.allocationStack)
 }
 
-// optional bytes jsObjectClassName = 6;
+// optional bytes jsObjectClassName = 7;
 inline bool Node::has_jsobjectclassname() const {
-  return (_has_bits_[0] & 0x00000020u) != 0;
+  return JSObjectClassNameOrRef_case() == kJsObjectClassName;
 }
 inline void Node::set_has_jsobjectclassname() {
-  _has_bits_[0] |= 0x00000020u;
-}
-inline void Node::clear_has_jsobjectclassname() {
-  _has_bits_[0] &= ~0x00000020u;
+  _oneof_case_[1] = kJsObjectClassName;
 }
 inline void Node::clear_jsobjectclassname() {
-  if (jsobjectclassname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    jsobjectclassname_->clear();
+  if (has_jsobjectclassname()) {
+    delete JSObjectClassNameOrRef_.jsobjectclassname_;
+    clear_has_JSObjectClassNameOrRef();
   }
-  clear_has_jsobjectclassname();
 }
 inline const ::std::string& Node::jsobjectclassname() const {
-  // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.jsObjectClassName)
-  return *jsobjectclassname_;
+  if (has_jsobjectclassname()) {
+    return *JSObjectClassNameOrRef_.jsobjectclassname_;
+  }
+  return ::google::protobuf::internal::GetEmptyStringAlreadyInited();
 }
 inline void Node::set_jsobjectclassname(const ::std::string& value) {
-  set_has_jsobjectclassname();
-  if (jsobjectclassname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    jsobjectclassname_ = new ::std::string;
+  if (!has_jsobjectclassname()) {
+    clear_JSObjectClassNameOrRef();
+    set_has_jsobjectclassname();
+    JSObjectClassNameOrRef_.jsobjectclassname_ = new ::std::string;
   }
-  jsobjectclassname_->assign(value);
-  // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Node.jsObjectClassName)
+  JSObjectClassNameOrRef_.jsobjectclassname_->assign(value);
 }
 inline void Node::set_jsobjectclassname(const char* value) {
-  set_has_jsobjectclassname();
-  if (jsobjectclassname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    jsobjectclassname_ = new ::std::string;
+  if (!has_jsobjectclassname()) {
+    clear_JSObjectClassNameOrRef();
+    set_has_jsobjectclassname();
+    JSObjectClassNameOrRef_.jsobjectclassname_ = new ::std::string;
   }
-  jsobjectclassname_->assign(value);
-  // @@protoc_insertion_point(field_set_char:mozilla.devtools.protobuf.Node.jsObjectClassName)
+  JSObjectClassNameOrRef_.jsobjectclassname_->assign(value);
 }
 inline void Node::set_jsobjectclassname(const void* value, size_t size) {
-  set_has_jsobjectclassname();
-  if (jsobjectclassname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    jsobjectclassname_ = new ::std::string;
+  if (!has_jsobjectclassname()) {
+    clear_JSObjectClassNameOrRef();
+    set_has_jsobjectclassname();
+    JSObjectClassNameOrRef_.jsobjectclassname_ = new ::std::string;
   }
-  jsobjectclassname_->assign(reinterpret_cast<const char*>(value), size);
-  // @@protoc_insertion_point(field_set_pointer:mozilla.devtools.protobuf.Node.jsObjectClassName)
+  JSObjectClassNameOrRef_.jsobjectclassname_->assign(
+      reinterpret_cast<const char*>(value), size);
 }
 inline ::std::string* Node::mutable_jsobjectclassname() {
-  set_has_jsobjectclassname();
-  if (jsobjectclassname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    jsobjectclassname_ = new ::std::string;
+  if (!has_jsobjectclassname()) {
+    clear_JSObjectClassNameOrRef();
+    set_has_jsobjectclassname();
+    JSObjectClassNameOrRef_.jsobjectclassname_ = new ::std::string;
   }
-  // @@protoc_insertion_point(field_mutable:mozilla.devtools.protobuf.Node.jsObjectClassName)
-  return jsobjectclassname_;
+  return JSObjectClassNameOrRef_.jsobjectclassname_;
 }
 inline ::std::string* Node::release_jsobjectclassname() {
-  clear_has_jsobjectclassname();
-  if (jsobjectclassname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    return NULL;
+  if (has_jsobjectclassname()) {
+    clear_has_JSObjectClassNameOrRef();
+    ::std::string* temp = JSObjectClassNameOrRef_.jsobjectclassname_;
+    JSObjectClassNameOrRef_.jsobjectclassname_ = NULL;
+    return temp;
   } else {
-    ::std::string* temp = jsobjectclassname_;
-    jsobjectclassname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-    return temp;
+    return NULL;
   }
 }
 inline void Node::set_allocated_jsobjectclassname(::std::string* jsobjectclassname) {
-  if (jsobjectclassname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete jsobjectclassname_;
-  }
+  clear_JSObjectClassNameOrRef();
   if (jsobjectclassname) {
     set_has_jsobjectclassname();
-    jsobjectclassname_ = jsobjectclassname;
-  } else {
-    clear_has_jsobjectclassname();
-    jsobjectclassname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    JSObjectClassNameOrRef_.jsobjectclassname_ = jsobjectclassname;
   }
-  // @@protoc_insertion_point(field_set_allocated:mozilla.devtools.protobuf.Node.jsObjectClassName)
 }
 
-// optional uint32 coarseType = 7 [default = 0];
+// optional uint64 jsObjectClassNameRef = 8;
+inline bool Node::has_jsobjectclassnameref() const {
+  return JSObjectClassNameOrRef_case() == kJsObjectClassNameRef;
+}
+inline void Node::set_has_jsobjectclassnameref() {
+  _oneof_case_[1] = kJsObjectClassNameRef;
+}
+inline void Node::clear_jsobjectclassnameref() {
+  if (has_jsobjectclassnameref()) {
+    JSObjectClassNameOrRef_.jsobjectclassnameref_ = GOOGLE_ULONGLONG(0);
+    clear_has_JSObjectClassNameOrRef();
+  }
+}
+inline ::google::protobuf::uint64 Node::jsobjectclassnameref() const {
+  if (has_jsobjectclassnameref()) {
+    return JSObjectClassNameOrRef_.jsobjectclassnameref_;
+  }
+  return GOOGLE_ULONGLONG(0);
+}
+inline void Node::set_jsobjectclassnameref(::google::protobuf::uint64 value) {
+  if (!has_jsobjectclassnameref()) {
+    clear_JSObjectClassNameOrRef();
+    set_has_jsobjectclassnameref();
+  }
+  JSObjectClassNameOrRef_.jsobjectclassnameref_ = value;
+}
+
+// optional uint32 coarseType = 9 [default = 0];
 inline bool Node::has_coarsetype() const {
-  return (_has_bits_[0] & 0x00000040u) != 0;
+  return (_has_bits_[0] & 0x00000100u) != 0;
 }
 inline void Node::set_has_coarsetype() {
-  _has_bits_[0] |= 0x00000040u;
+  _has_bits_[0] |= 0x00000100u;
 }
 inline void Node::clear_has_coarsetype() {
-  _has_bits_[0] &= ~0x00000040u;
+  _has_bits_[0] &= ~0x00000100u;
 }
 inline void Node::clear_coarsetype() {
   coarsetype_ = 0u;
   clear_has_coarsetype();
 }
 inline ::google::protobuf::uint32 Node::coarsetype() const {
   // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.coarseType)
   return coarsetype_;
 }
 inline void Node::set_coarsetype(::google::protobuf::uint32 value) {
   set_has_coarsetype();
   coarsetype_ = value;
   // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Node.coarseType)
 }
 
+inline bool Node::has_TypeNameOrRef() {
+  return TypeNameOrRef_case() != TYPENAMEORREF_NOT_SET;
+}
+inline void Node::clear_has_TypeNameOrRef() {
+  _oneof_case_[0] = TYPENAMEORREF_NOT_SET;
+}
+inline bool Node::has_JSObjectClassNameOrRef() {
+  return JSObjectClassNameOrRef_case() != JSOBJECTCLASSNAMEORREF_NOT_SET;
+}
+inline void Node::clear_has_JSObjectClassNameOrRef() {
+  _oneof_case_[1] = JSOBJECTCLASSNAMEORREF_NOT_SET;
+}
+inline Node::TypeNameOrRefCase Node::TypeNameOrRef_case() const {
+  return Node::TypeNameOrRefCase(_oneof_case_[0]);
+}
+inline Node::JSObjectClassNameOrRefCase Node::JSObjectClassNameOrRef_case() const {
+  return Node::JSObjectClassNameOrRefCase(_oneof_case_[1]);
+}
 // -------------------------------------------------------------------
 
 // Edge
 
 // optional uint64 referent = 1;
 inline bool Edge::has_referent() const {
   return (_has_bits_[0] & 0x00000001u) != 0;
 }
@@ -1390,90 +1621,120 @@ inline ::google::protobuf::uint64 Edge::
 inline void Edge::set_referent(::google::protobuf::uint64 value) {
   set_has_referent();
   referent_ = value;
   // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Edge.referent)
 }
 
 // optional bytes name = 2;
 inline bool Edge::has_name() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return EdgeNameOrRef_case() == kName;
 }
 inline void Edge::set_has_name() {
-  _has_bits_[0] |= 0x00000002u;
-}
-inline void Edge::clear_has_name() {
-  _has_bits_[0] &= ~0x00000002u;
+  _oneof_case_[0] = kName;
 }
 inline void Edge::clear_name() {
-  if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    name_->clear();
+  if (has_name()) {
+    delete EdgeNameOrRef_.name_;
+    clear_has_EdgeNameOrRef();
   }
-  clear_has_name();
 }
 inline const ::std::string& Edge::name() const {
-  // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Edge.name)
-  return *name_;
+  if (has_name()) {
+    return *EdgeNameOrRef_.name_;
+  }
+  return ::google::protobuf::internal::GetEmptyStringAlreadyInited();
 }
 inline void Edge::set_name(const ::std::string& value) {
-  set_has_name();
-  if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    name_ = new ::std::string;
+  if (!has_name()) {
+    clear_EdgeNameOrRef();
+    set_has_name();
+    EdgeNameOrRef_.name_ = new ::std::string;
   }
-  name_->assign(value);
-  // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Edge.name)
+  EdgeNameOrRef_.name_->assign(value);
 }
 inline void Edge::set_name(const char* value) {
-  set_has_name();
-  if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    name_ = new ::std::string;
+  if (!has_name()) {
+    clear_EdgeNameOrRef();
+    set_has_name();
+    EdgeNameOrRef_.name_ = new ::std::string;
   }
-  name_->assign(value);
-  // @@protoc_insertion_point(field_set_char:mozilla.devtools.protobuf.Edge.name)
+  EdgeNameOrRef_.name_->assign(value);
 }
 inline void Edge::set_name(const void* value, size_t size) {
-  set_has_name();
-  if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    name_ = new ::std::string;
+  if (!has_name()) {
+    clear_EdgeNameOrRef();
+    set_has_name();
+    EdgeNameOrRef_.name_ = new ::std::string;
   }
-  name_->assign(reinterpret_cast<const char*>(value), size);
-  // @@protoc_insertion_point(field_set_pointer:mozilla.devtools.protobuf.Edge.name)
+  EdgeNameOrRef_.name_->assign(
+      reinterpret_cast<const char*>(value), size);
 }
 inline ::std::string* Edge::mutable_name() {
-  set_has_name();
-  if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    name_ = new ::std::string;
+  if (!has_name()) {
+    clear_EdgeNameOrRef();
+    set_has_name();
+    EdgeNameOrRef_.name_ = new ::std::string;
   }
-  // @@protoc_insertion_point(field_mutable:mozilla.devtools.protobuf.Edge.name)
-  return name_;
+  return EdgeNameOrRef_.name_;
 }
 inline ::std::string* Edge::release_name() {
-  clear_has_name();
-  if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    return NULL;
+  if (has_name()) {
+    clear_has_EdgeNameOrRef();
+    ::std::string* temp = EdgeNameOrRef_.name_;
+    EdgeNameOrRef_.name_ = NULL;
+    return temp;
   } else {
-    ::std::string* temp = name_;
-    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-    return temp;
+    return NULL;
   }
 }
 inline void Edge::set_allocated_name(::std::string* name) {
-  if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
-    delete name_;
-  }
+  clear_EdgeNameOrRef();
   if (name) {
     set_has_name();
-    name_ = name;
-  } else {
-    clear_has_name();
-    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    EdgeNameOrRef_.name_ = name;
   }
-  // @@protoc_insertion_point(field_set_allocated:mozilla.devtools.protobuf.Edge.name)
 }
 
+// optional uint64 nameRef = 3;
+inline bool Edge::has_nameref() const {
+  return EdgeNameOrRef_case() == kNameRef;
+}
+inline void Edge::set_has_nameref() {
+  _oneof_case_[0] = kNameRef;
+}
+inline void Edge::clear_nameref() {
+  if (has_nameref()) {
+    EdgeNameOrRef_.nameref_ = GOOGLE_ULONGLONG(0);
+    clear_has_EdgeNameOrRef();
+  }
+}
+inline ::google::protobuf::uint64 Edge::nameref() const {
+  if (has_nameref()) {
+    return EdgeNameOrRef_.nameref_;
+  }
+  return GOOGLE_ULONGLONG(0);
+}
+inline void Edge::set_nameref(::google::protobuf::uint64 value) {
+  if (!has_nameref()) {
+    clear_EdgeNameOrRef();
+    set_has_nameref();
+  }
+  EdgeNameOrRef_.nameref_ = value;
+}
+
+inline bool Edge::has_EdgeNameOrRef() {
+  return EdgeNameOrRef_case() != EDGENAMEORREF_NOT_SET;
+}
+inline void Edge::clear_has_EdgeNameOrRef() {
+  _oneof_case_[0] = EDGENAMEORREF_NOT_SET;
+}
+inline Edge::EdgeNameOrRefCase Edge::EdgeNameOrRef_case() const {
+  return Edge::EdgeNameOrRefCase(_oneof_case_[0]);
+}
 
 // @@protoc_insertion_point(namespace_scope)
 
 }  // namespace protobuf
 }  // namespace devtools
 }  // namespace mozilla
 
 #ifndef SWIG
--- a/devtools/shared/heapsnapshot/CoreDump.proto
+++ b/devtools/shared/heapsnapshot/CoreDump.proto
@@ -33,21 +33,35 @@
 //     +-----------------------------------------------------------------------+
 //     | message: A `Node` message.                                            |
 //     +-----------------------------------------------------------------------+
 //     | .                                                                     |
 //     | .                                                                     |
 //     | .                                                                     |
 //     +-----------------------------------------------------------------------+
 //
-// In practice, certain message fields have a lot of duplication (such as type
-// or edge name strings). Rather than try and de-duplicate this information at
-// the protobuf message and field level, core dumps should be written with
-// `google::protobuf::io::GzipOutputStream` and read from
+// Core dumps should always be written with a
+// `google::protobuf::io::GzipOutputStream` and read from a
 // `google::protobuf::io::GzipInputStream`.
+//
+// Note that all strings are de-duplicated. The first time the N^th unique
+// string is encountered, the full string is serialized. Subsequent times that
+// same string is encountered, it is referenced by N. This de-duplication
+// happens across string properties, not on a per-property basis. For example,
+// if the same K^th unique string is first used as an Edge::EdgeNameOrRef and
+// then as a StackFrame::Data::FunctionDisplayNameOrRef, the first will be the
+// actual string as the functionDisplayName oneof property, and the second will
+// be a reference to the first as the edgeNameRef oneof property whose value is
+// K.
+//
+// We would ordinarily abstract these de-duplicated strings with messages of
+// their own, but unfortunately, the protobuf compiler does not have a way to
+// inline a messsage within another message and the child message must be
+// referenced by pointer. This leads to extra mallocs that we wish to avoid.
+
 
 package mozilla.devtools.protobuf;
 
 // A collection of metadata about this core dump.
 message Metadata {
     // Number of microseconds since midnight (00:00:00) 1 January 1970 UTC.
     optional uint64 timeStamp = 1;
 }
@@ -60,41 +74,64 @@ message StackFrame {
         // here is all of its data.
         Data   data = 1;
         // A reference to a stack frame that has already been serialized and has
         // the given number as its id.
         uint64 ref  = 2;
     }
 
     message Data {
-        optional uint64 id = 1;
-        optional StackFrame parent = 2;
-        optional uint32 line = 3;
-        optional uint32 column = 4;
-        // char16_t[]
-        optional bytes source = 5;
-        // char16_t[]
-        optional bytes functionDisplayName = 6;
-        optional bool isSystem = 7;
-        optional bool isSelfHosted = 8;
+        optional uint64        id           = 1;
+        optional StackFrame    parent       = 2;
+        optional uint32        line         = 3;
+        optional uint32        column       = 4;
+
+        // De-duplicated two-byte string.
+        oneof SourceOrRef {
+            bytes  source                   = 5;
+            uint64 sourceRef                = 6;
+        }
+
+        // De-duplicated two-byte string.
+        oneof FunctionDisplayNameOrRef {
+            bytes  functionDisplayName      = 7;
+            uint64 functionDisplayNameRef   = 8;
+        }
+
+        optional bool          isSystem     = 9;
+        optional bool          isSelfHosted = 10;
     }
 }
 
 // A serialized version of `JS::ubi::Node` and its outgoing edges.
 message Node {
-    optional uint64     id                = 1;
-    // char16_t[]
-    optional bytes      typeName          = 2;
-    optional uint64     size              = 3;
-    repeated Edge       edges             = 4;
-    optional StackFrame allocationStack   = 5;
-    // char[]
-    optional bytes      jsObjectClassName = 6;
+    optional uint64     id                   = 1;
+
+    // De-duplicated two-byte string.
+    oneof TypeNameOrRef {
+        bytes           typeName             = 2;
+        uint64          typeNameRef          = 3;
+    }
+    
+    optional uint64     size                 = 4;
+    repeated Edge       edges                = 5;
+    optional StackFrame allocationStack      = 6;
+
+    // De-duplicated one-byte string.
+    oneof JSObjectClassNameOrRef {
+        bytes           jsObjectClassName    = 7;
+        uint64          jsObjectClassNameRef = 8;
+    }
+
     // JS::ubi::CoarseType. Defaults to Other.
-    optional uint32     coarseType        = 7 [default = 0];
+    optional uint32     coarseType           = 9 [default = 0];
 }
 
 // A serialized edge from the heap graph.
 message Edge {
-    optional uint64 referent = 1;
-    // char16_t[]
-    optional bytes  name     = 2;
+    optional uint64 referent    = 1;
+
+    // De-duplicated two-byte string.
+    oneof EdgeNameOrRef {
+        bytes       name    = 2;
+        uint64      nameRef = 3;
+    }
 }
--- a/devtools/shared/heapsnapshot/DeserializedNode.cpp
+++ b/devtools/shared/heapsnapshot/DeserializedNode.cpp
@@ -5,55 +5,30 @@
 
 #include "mozilla/devtools/DeserializedNode.h"
 #include "mozilla/devtools/HeapSnapshot.h"
 #include "nsCRTGlue.h"
 
 namespace mozilla {
 namespace devtools {
 
-DeserializedEdge::DeserializedEdge()
-  : referent(0)
-  , name(nullptr)
-{ }
-
 DeserializedEdge::DeserializedEdge(DeserializedEdge&& rhs)
 {
   referent = rhs.referent;
   name = rhs.name;
 }
 
 DeserializedEdge& DeserializedEdge::operator=(DeserializedEdge&& rhs)
 {
   MOZ_ASSERT(&rhs != this);
   this->~DeserializedEdge();
   new(this) DeserializedEdge(Move(rhs));
   return *this;
 }
 
-bool
-DeserializedEdge::init(const protobuf::Edge& edge, HeapSnapshot& owner)
-{
-  // Although the referent property is optional in the protobuf format for
-  // future compatibility, we can't semantically have an edge to nowhere and
-  // require a referent here.
-  if (!edge.has_referent())
-    return false;
-  referent = edge.referent();
-
-  if (edge.has_name()) {
-    const char16_t* duplicateEdgeName = reinterpret_cast<const char16_t*>(edge.name().c_str());
-    name = owner.borrowUniqueString(duplicateEdgeName, edge.name().length() / sizeof(char16_t));
-    if (!name)
-      return false;
-  }
-
-  return true;
-}
-
 JS::ubi::Node
 DeserializedNode::getEdgeReferent(const DeserializedEdge& edge)
 {
   auto ptr = owner->nodes.lookup(edge.referent);
   MOZ_ASSERT(ptr);
 
   // `HashSets` only provide const access to their values, because mutating a
   // value might change its hash, rendering it unfindable in the set.
--- a/devtools/shared/heapsnapshot/DeserializedNode.h
+++ b/devtools/shared/heapsnapshot/DeserializedNode.h
@@ -35,23 +35,23 @@ using StackFrameId = uint64_t;
 // A `DeserializedEdge` represents an edge in the heap graph pointing to the
 // node with id equal to `DeserializedEdge::referent` that we deserialized from
 // a core dump.
 struct DeserializedEdge {
   NodeId         referent;
   // A borrowed reference to a string owned by this node's owning HeapSnapshot.
   const char16_t* name;
 
-  explicit DeserializedEdge();
+  explicit DeserializedEdge(NodeId referent, const char16_t* edgeName = nullptr)
+    : referent(referent)
+    , name(edgeName)
+  { }
   DeserializedEdge(DeserializedEdge&& rhs);
   DeserializedEdge& operator=(DeserializedEdge&& rhs);
 
-  // Initialize this `DeserializedEdge` from the given `protobuf::Edge` message.
-  bool init(const protobuf::Edge& edge, HeapSnapshot& owner);
-
 private:
   DeserializedEdge(const DeserializedEdge&) = delete;
   DeserializedEdge& operator=(const DeserializedEdge&) = delete;
 };
 
 // A `DeserializedNode` is a node in the heap graph that we deserialized from a
 // core dump.
 struct DeserializedNode {
@@ -60,48 +60,49 @@ struct DeserializedNode {
 
   NodeId              id;
   JS::ubi::CoarseType coarseType;
   // A borrowed reference to a string owned by this node's owning HeapSnapshot.
   const char16_t*     typeName;
   uint64_t            size;
   EdgeVector          edges;
   Maybe<StackFrameId> allocationStack;
-  UniquePtr<char[]>   jsObjectClassName;
+  // A borrowed reference to a string owned by this node's owning HeapSnapshot.
+  const char*         jsObjectClassName;
   // A weak pointer to this node's owning `HeapSnapshot`. Safe without
   // AddRef'ing because this node's lifetime is equal to that of its owner.
   HeapSnapshot*       owner;
 
   DeserializedNode(NodeId id,
                    JS::ubi::CoarseType coarseType,
                    const char16_t* typeName,
                    uint64_t size,
                    EdgeVector&& edges,
                    Maybe<StackFrameId> allocationStack,
-                   UniquePtr<char[]>&& className,
+                   const char* className,
                    HeapSnapshot& owner)
     : id(id)
     , coarseType(coarseType)
     , typeName(typeName)
     , size(size)
     , edges(Move(edges))
     , allocationStack(allocationStack)
-    , jsObjectClassName(Move(className))
+    , jsObjectClassName(className)
     , owner(&owner)
   { }
   virtual ~DeserializedNode() { }
 
   DeserializedNode(DeserializedNode&& rhs)
     : id(rhs.id)
     , coarseType(rhs.coarseType)
     , typeName(rhs.typeName)
     , size(rhs.size)
     , edges(Move(rhs.edges))
     , allocationStack(rhs.allocationStack)
-    , jsObjectClassName(Move(rhs.jsObjectClassName))
+    , jsObjectClassName(rhs.jsObjectClassName)
     , owner(rhs.owner)
   { }
 
   DeserializedNode& operator=(DeserializedNode&& rhs)
   {
     MOZ_ASSERT(&rhs != this);
     this->~DeserializedNode();
     new(this) DeserializedNode(Move(rhs));
@@ -253,17 +254,17 @@ public:
     new (storage) Concrete(ptr);
   }
 
   CoarseType coarseType() const final { return get().coarseType; }
   Id identifier() const override { return get().id; }
   bool isLive() const override { return false; }
   const char16_t* typeName() const override;
   Node::Size size(mozilla::MallocSizeOf mallocSizeof) const override;
-  const char* jsObjectClassName() const override { return get().jsObjectClassName.get(); }
+  const char* jsObjectClassName() const override { return get().jsObjectClassName; }
 
   bool hasAllocationStack() const override { return get().allocationStack.isSome(); }
   StackFrame allocationStack() const override;
 
   // We ignore the `bool wantNames` parameter because we can't control whether
   // the core dump was serialized with edge names or not.
   UniquePtr<EdgeRange> edges(JSRuntime* rt, bool) const override;
 };
--- a/devtools/shared/heapsnapshot/HeapSnapshot.cpp
+++ b/devtools/shared/heapsnapshot/HeapSnapshot.cpp
@@ -45,16 +45,18 @@ namespace devtools {
 using namespace JS;
 using namespace dom;
 
 using ::google::protobuf::io::ArrayInputStream;
 using ::google::protobuf::io::CodedInputStream;
 using ::google::protobuf::io::GzipInputStream;
 using ::google::protobuf::io::ZeroCopyInputStream;
 
+using JS::ubi::AtomOrTwoByteChars;
+
 NS_IMPL_CYCLE_COLLECTION_CLASS(HeapSnapshot)
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(HeapSnapshot)
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(HeapSnapshot)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
@@ -117,86 +119,169 @@ parseMessage(ZeroCopyInputStream& stream
   {
     return false;
   }
 
   codedStream.PopLimit(limit);
   return true;
 }
 
+template<typename CharT, typename InternedStringSet>
+struct GetOrInternStringMatcher
+{
+  using ReturnType = const CharT*;
+
+  InternedStringSet& internedStrings;
+
+  explicit GetOrInternStringMatcher(InternedStringSet& strings) : internedStrings(strings) { }
+
+  const CharT* match(const std::string* str) {
+    MOZ_ASSERT(str);
+    size_t length = str->length() / sizeof(CharT);
+    auto tempString = reinterpret_cast<const CharT*>(str->data());
+
+    UniquePtr<CharT[], NSFreePolicy> owned(NS_strndup(tempString, length));
+    if (!owned || !internedStrings.append(Move(owned)))
+      return nullptr;
+
+    return internedStrings.back().get();
+  }
+
+  const CharT* match(uint64_t ref) {
+    if (MOZ_LIKELY(ref < internedStrings.length())) {
+      auto& string = internedStrings[ref];
+      MOZ_ASSERT(string);
+      return string.get();
+    }
+
+    return nullptr;
+  }
+};
+
+template<
+  // Either char or char16_t.
+  typename CharT,
+  // A reference to either `internedOneByteStrings` or `internedTwoByteStrings`
+  // if CharT is char or char16_t respectively.
+  typename InternedStringSet>
+const CharT*
+HeapSnapshot::getOrInternString(InternedStringSet& internedStrings,
+                                Maybe<StringOrRef>& maybeStrOrRef)
+{
+  // Incomplete message: has neither a string nor a reference to an already
+  // interned string.
+  if (MOZ_UNLIKELY(maybeStrOrRef.isNothing()))
+    return nullptr;
+
+  GetOrInternStringMatcher<CharT, InternedStringSet> m(internedStrings);
+  return maybeStrOrRef->match(m);
+}
+
+// Get a de-duplicated string as a Maybe<StringOrRef> from the given `msg`.
+#define GET_STRING_OR_REF_WITH_PROP_NAMES(msg, strPropertyName, refPropertyName) \
+  (msg.has_##refPropertyName()                                                   \
+    ? Some(StringOrRef(msg.refPropertyName()))                                   \
+    : msg.has_##strPropertyName()                                                \
+      ? Some(StringOrRef(&msg.strPropertyName()))                                \
+      : Nothing())
+
+#define GET_STRING_OR_REF(msg, property)      \
+  (msg.has_##property##ref()                  \
+     ? Some(StringOrRef(msg.property##ref())) \
+     : msg.has_##property()                   \
+       ? Some(StringOrRef(&msg.property()))   \
+       : Nothing())
+
 bool
 HeapSnapshot::saveNode(const protobuf::Node& node)
 {
-  if (!node.has_id())
+  // NB: de-duplicated string properties must be read back and interned in the
+  // same order here as they are written and serialized in
+  // `CoreDumpWriter::writeNode` or else indices in references to already
+  // serialized strings will be off.
+
+  if (NS_WARN_IF(!node.has_id()))
     return false;
   NodeId id = node.id();
 
   // Should only deserialize each node once.
-  if (nodes.has(id))
+  if (NS_WARN_IF(nodes.has(id)))
     return false;
 
-  if (!JS::ubi::Uint32IsValidCoarseType(node.coarsetype()))
+  if (NS_WARN_IF(!JS::ubi::Uint32IsValidCoarseType(node.coarsetype())))
     return false;
   auto coarseType = JS::ubi::Uint32ToCoarseType(node.coarsetype());
 
-  if (!node.has_typename_())
+  Maybe<StringOrRef> typeNameOrRef = GET_STRING_OR_REF_WITH_PROP_NAMES(node, typename_, typenameref);
+  auto typeName = getOrInternString<char16_t>(internedTwoByteStrings, typeNameOrRef);
+  if (NS_WARN_IF(!typeName))
     return false;
 
-  auto duplicatedTypeName = reinterpret_cast<const char16_t*>(
-    node.typename_().data());
-  auto length = node.typename_().length() / sizeof(char16_t);
-  auto typeName = borrowUniqueString(duplicatedTypeName, length);
-  if (!typeName)
-    return false;
-
-  if (!node.has_size())
+  if (NS_WARN_IF(!node.has_size()))
     return false;
   uint64_t size = node.size();
 
   auto edgesLength = node.edges_size();
   DeserializedNode::EdgeVector edges;
-  if (!edges.reserve(edgesLength))
+  if (NS_WARN_IF(!edges.reserve(edgesLength)))
     return false;
   for (decltype(edgesLength) i = 0; i < edgesLength; i++) {
-    DeserializedEdge edge;
-    if (!edge.init(node.edges(i), *this))
+    auto& protoEdge = node.edges(i);
+
+    if (NS_WARN_IF(!protoEdge.has_referent()))
       return false;
-    edges.infallibleAppend(Move(edge));
+    NodeId referent = protoEdge.referent();
+
+    const char16_t* edgeName = nullptr;
+    if (protoEdge.EdgeNameOrRef_case() != protobuf::Edge::EDGENAMEORREF_NOT_SET) {
+      Maybe<StringOrRef> edgeNameOrRef = GET_STRING_OR_REF(protoEdge, name);
+      edgeName = getOrInternString<char16_t>(internedTwoByteStrings, edgeNameOrRef);
+      if (NS_WARN_IF(!edgeName))
+        return false;
+    }
+
+    edges.infallibleAppend(DeserializedEdge(referent, edgeName));
   }
 
   Maybe<StackFrameId> allocationStack;
   if (node.has_allocationstack()) {
     StackFrameId id = 0;
-    if (!saveStackFrame(node.allocationstack(), id))
+    if (NS_WARN_IF(!saveStackFrame(node.allocationstack(), id)))
       return false;
     allocationStack.emplace(id);
   }
   MOZ_ASSERT(allocationStack.isSome() == node.has_allocationstack());
 
-  UniquePtr<char[]> jsObjectClassName;
-  if (node.has_jsobjectclassname()) {
-    auto length = node.jsobjectclassname().length();
-    jsObjectClassName.reset(static_cast<char*>(malloc(length + 1)));
-    if (!jsObjectClassName)
+  const char* jsObjectClassName = nullptr;
+  if (node.JSObjectClassNameOrRef_case() != protobuf::Node::JSOBJECTCLASSNAMEORREF_NOT_SET) {
+    Maybe<StringOrRef> clsNameOrRef = GET_STRING_OR_REF(node, jsobjectclassname);
+    jsObjectClassName = getOrInternString<char>(internedOneByteStrings, clsNameOrRef);
+    if (NS_WARN_IF(!jsObjectClassName))
       return false;
-    strncpy(jsObjectClassName.get(), node.jsobjectclassname().data(),
-            length);
-    jsObjectClassName.get()[length] = '\0';
   }
 
-  return nodes.putNew(id, DeserializedNode(id, coarseType, typeName, size,
-                                           Move(edges), allocationStack,
-                                           Move(jsObjectClassName),
-                                           *this));
+  if (NS_WARN_IF(!nodes.putNew(id, DeserializedNode(id, coarseType, typeName,
+                                                    size, Move(edges),
+                                                    allocationStack,
+                                                    jsObjectClassName, *this))))
+  {
+    return false;
+  };
+
+  return true;
 }
 
 bool
 HeapSnapshot::saveStackFrame(const protobuf::StackFrame& frame,
                              StackFrameId& outFrameId)
 {
+  // NB: de-duplicated string properties must be read in the same order here as
+  // they are written in `CoreDumpWriter::getProtobufStackFrame` or else indices
+  // in references to already serialized strings will be off.
+
   if (frame.has_ref()) {
     // We should only get a reference to the previous frame if we have already
     // seen the previous frame.
     if (!frames.has(frame.ref()))
       return false;
 
     outFrameId = frame.ref();
     return true;
@@ -211,59 +296,55 @@ HeapSnapshot::saveStackFrame(const proto
   if (!data.has_id())
     return false;
   StackFrameId id = data.id();
 
   // This should be the first and only time we see this frame.
   if (frames.has(id))
     return false;
 
-  Maybe<StackFrameId> parent;
-  if (data.has_parent()) {
-    StackFrameId parentId = 0;
-    if (!saveStackFrame(data.parent(), parentId))
-      return false;
-    parent = Some(parentId);
-  }
-
   if (!data.has_line())
     return false;
   uint32_t line = data.line();
 
   if (!data.has_column())
     return false;
   uint32_t column = data.column();
 
-  auto duplicatedSource = reinterpret_cast<const char16_t*>(
-    data.source().data());
-  size_t sourceLength = data.source().length() / sizeof(char16_t);
-  const char16_t* source = borrowUniqueString(duplicatedSource, sourceLength);
-  if (!source)
-    return false;
-
-  const char16_t* functionDisplayName = nullptr;
-  if (data.has_functiondisplayname() && data.functiondisplayname().length() > 0) {
-    auto duplicatedName = reinterpret_cast<const char16_t*>(
-      data.functiondisplayname().data());
-    size_t nameLength = data.functiondisplayname().length() / sizeof(char16_t);
-    functionDisplayName = borrowUniqueString(duplicatedName, nameLength);
-    if (!functionDisplayName)
-      return false;
-  }
-  MOZ_ASSERT(!!functionDisplayName == (data.has_functiondisplayname() &&
-                                       data.functiondisplayname().length() > 0));
-
   if (!data.has_issystem())
     return false;
   bool isSystem = data.issystem();
 
   if (!data.has_isselfhosted())
     return false;
   bool isSelfHosted = data.isselfhosted();
 
+  Maybe<StringOrRef> sourceOrRef = GET_STRING_OR_REF(data, source);
+  auto source = getOrInternString<char16_t>(internedTwoByteStrings, sourceOrRef);
+  if (!source)
+    return false;
+
+  const char16_t* functionDisplayName = nullptr;
+  if (data.FunctionDisplayNameOrRef_case() !=
+      protobuf::StackFrame_Data::FUNCTIONDISPLAYNAMEORREF_NOT_SET)
+  {
+    Maybe<StringOrRef> nameOrRef = GET_STRING_OR_REF(data, functiondisplayname);
+    functionDisplayName = getOrInternString<char16_t>(internedTwoByteStrings, nameOrRef);
+    if (!functionDisplayName)
+      return false;
+  }
+
+  Maybe<StackFrameId> parent;
+  if (data.has_parent()) {
+    StackFrameId parentId = 0;
+    if (!saveStackFrame(data.parent(), parentId))
+      return false;
+    parent = Some(parentId);
+  }
+
   if (!frames.putNew(id, DeserializedStackFrame(id, parent, line, column,
                                                 source, functionDisplayName,
                                                 isSystem, isSelfHosted, *this)))
   {
     return false;
   }
 
   outFrameId = id;
@@ -291,17 +372,17 @@ StreamHasData(GzipInputStream& stream)
   // to the stream and let the parser get at it.
   stream.BackUp(size);
   return true;
 }
 
 bool
 HeapSnapshot::init(const uint8_t* buffer, uint32_t size)
 {
-  if (!nodes.init() || !frames.init() || !strings.init())
+  if (!nodes.init() || !frames.init())
     return false;
 
   ArrayInputStream stream(buffer, size);
   GzipInputStream gzipStream(&stream);
 
   // First is the metadata.
 
   protobuf::Metadata metadata;
@@ -333,32 +414,16 @@ HeapSnapshot::init(const uint8_t* buffer
       return false;
     if (NS_WARN_IF(!saveNode(node)))
       return false;
   }
 
   return true;
 }
 
-const char16_t*
-HeapSnapshot::borrowUniqueString(const char16_t* duplicateString, size_t length)
-{
-  MOZ_ASSERT(duplicateString);
-  UniqueStringHashPolicy::Lookup lookup(duplicateString, length);
-  auto ptr = strings.lookupForAdd(lookup);
-
-  if (!ptr) {
-    UniqueString owned(NS_strndup(duplicateString, length));
-    if (!owned || !strings.add(ptr, Move(owned)))
-      return nullptr;
-  }
-
-  MOZ_ASSERT(ptr->get() != duplicateString);
-  return ptr->get();
-}
 
 /*** Heap Snapshot Analyses ***********************************************************************/
 
 void
 HeapSnapshot::TakeCensus(JSContext* cx, JS::HandleObject options,
                          JS::MutableHandleValue rval, ErrorResult& rv)
 {
   JS::ubi::Census census(cx);
@@ -402,16 +467,20 @@ HeapSnapshot::TakeCensus(JSContext* cx, 
   }
 
   if (NS_WARN_IF(!handler.report(rval))) {
     rv.Throw(NS_ERROR_OUT_OF_MEMORY);
     return;
   }
 }
 
+#undef GET_STRING_OR_REF_WITH_PROP_NAMES
+#undef GET_STRING_OR_REF
+
+
 /*** Saving Heap Snapshots ************************************************************************/
 
 // If we are only taking a snapshot of the heap affected by the given set of
 // globals, find the set of zones the globals are allocated within. Returns
 // false on OOM failure.
 static bool
 PopulateZonesWithGlobals(ZoneSet& zones, AutoObjectVector& globals)
 {
@@ -544,41 +613,306 @@ EstablishBoundaries(JSContext* cx,
 
   MOZ_ASSERT(roots.initialized());
   MOZ_ASSERT_IF(boundaries.mDebugger.WasPassed(), zones.initialized());
   MOZ_ASSERT_IF(boundaries.mGlobals.WasPassed(), zones.initialized());
   return true;
 }
 
 
+// A variant covering all the various two-byte strings that we can get from the
+// ubi::Node API.
+class TwoByteString : public Variant<JSAtom*, const char16_t*, JS::ubi::EdgeName>
+{
+  using Base = Variant<JSAtom*, const char16_t*, JS::ubi::EdgeName>;
+
+  struct AsTwoByteStringMatcher
+  {
+    using ReturnType = TwoByteString;
+
+    TwoByteString match(JSAtom* atom) {
+      return TwoByteString(atom);
+    }
+
+    TwoByteString match(const char16_t* chars) {
+      return TwoByteString(chars);
+    }
+  };
+
+  struct IsNonNullMatcher
+  {
+    using ReturnType = bool;
+
+    template<typename T>
+    bool match(const T& t) { return t != nullptr; }
+  };
+
+  struct LengthMatcher
+  {
+    using ReturnType = size_t;
+
+    size_t match(JSAtom* atom) {
+      MOZ_ASSERT(atom);
+      JS::ubi::AtomOrTwoByteChars s(atom);
+      return s.length();
+    }
+
+    size_t match(const char16_t* chars) {
+      MOZ_ASSERT(chars);
+      return NS_strlen(chars);
+    }
+
+    size_t match(const JS::ubi::EdgeName& ptr) {
+      MOZ_ASSERT(ptr);
+      return NS_strlen(ptr.get());
+    }
+  };
+
+  struct CopyToBufferMatcher
+  {
+    using ReturnType = size_t;
+
+    RangedPtr<char16_t> destination;
+    size_t              maxLength;
+
+    CopyToBufferMatcher(RangedPtr<char16_t> destination, size_t maxLength)
+      : destination(destination)
+      , maxLength(maxLength)
+    { }
+
+    size_t match(JS::ubi::EdgeName& ptr) {
+      return ptr ? match(ptr.get()) : 0;
+    }
+
+    size_t match(JSAtom* atom) {
+      MOZ_ASSERT(atom);
+      JS::ubi::AtomOrTwoByteChars s(atom);
+      return s.copyToBuffer(destination, maxLength);
+    }
+
+    size_t match(const char16_t* chars) {
+      MOZ_ASSERT(chars);
+      JS::ubi::AtomOrTwoByteChars s(chars);
+      return s.copyToBuffer(destination, maxLength);
+    }
+  };
+
+public:
+  template<typename T>
+  MOZ_IMPLICIT TwoByteString(T&& rhs) : Base(Forward<T>(rhs)) { }
+
+  template<typename T>
+  TwoByteString& operator=(T&& rhs) {
+    MOZ_ASSERT(this != &rhs, "self-move disallowed");
+    this->~TwoByteString();
+    new (this) TwoByteString(Forward<T>(rhs));
+    return *this;
+  }
+
+  TwoByteString(const TwoByteString&) = delete;
+  TwoByteString& operator=(const TwoByteString&) = delete;
+
+  // Rewrap the inner value of a JS::ubi::AtomOrTwoByteChars as a TwoByteString.
+  static TwoByteString from(JS::ubi::AtomOrTwoByteChars&& s) {
+    AsTwoByteStringMatcher m;
+    return s.match(m);
+  }
+
+  // Returns true if the given TwoByteString is non-null, false otherwise.
+  bool isNonNull() const {
+    IsNonNullMatcher m;
+    return match(m);
+  }
+
+  // Return the length of the string, 0 if it is null.
+  size_t length() const {
+    LengthMatcher m;
+    return match(m);
+  }
+
+  // Copy the contents of a TwoByteString into the provided buffer. The buffer
+  // is NOT null terminated. The number of characters written is returned.
+  size_t copyToBuffer(RangedPtr<char16_t> destination, size_t maxLength) {
+    CopyToBufferMatcher m(destination, maxLength);
+    return match(m);
+  }
+
+  struct HashPolicy;
+};
+
+// A hashing policy for TwoByteString.
+//
+// Atoms are pointer hashed and use pointer equality, which means that we
+// tolerate some duplication across atoms and the other two types of two-byte
+// strings. In practice, we expect the amount of this duplication to be very low
+// because each type is generally a different semantic thing in addition to
+// having a slightly different representation. For example, the set of edge
+// names and the set stack frames' source names naturally tend not to overlap
+// very much if at all.
+struct TwoByteString::HashPolicy {
+  using Lookup = TwoByteString;
+
+  struct HashingMatcher {
+    using ReturnType  = js::HashNumber;
+
+    js::HashNumber match(const JSAtom* atom) {
+      return js::DefaultHasher<const JSAtom*>::hash(atom);
+    }
+
+    js::HashNumber match(const char16_t* chars) {
+      MOZ_ASSERT(chars);
+      auto length = NS_strlen(chars);
+      return HashString(chars, length);
+    }
+
+    js::HashNumber match(const JS::ubi::EdgeName& ptr) {
+      MOZ_ASSERT(ptr);
+      return match(ptr.get());
+    }
+  };
+
+  static js::HashNumber hash(const Lookup& l) {
+    HashingMatcher hasher;
+    return l.match(hasher);
+  }
+
+  struct EqualityMatcher {
+    using ReturnType = bool;
+    const TwoByteString& rhs;
+    explicit EqualityMatcher(const TwoByteString& rhs) : rhs(rhs) { }
+
+    bool match(const JSAtom* atom) {
+      return rhs.is<JSAtom*>() && rhs.as<JSAtom*>() == atom;
+    }
+
+    bool match(const char16_t* chars) {
+      MOZ_ASSERT(chars);
+
+      const char16_t* rhsChars = nullptr;
+      if (rhs.is<const char16_t*>())
+        rhsChars = rhs.as<const char16_t*>();
+      else if (rhs.is<JS::ubi::EdgeName>())
+        rhsChars = rhs.as<JS::ubi::EdgeName>().get();
+      else
+        return false;
+      MOZ_ASSERT(rhsChars);
+
+      auto length = NS_strlen(chars);
+      if (NS_strlen(rhsChars) != length)
+        return false;
+
+      return memcmp(chars, rhsChars, length * sizeof(char16_t)) == 0;
+    }
+
+    bool match(const JS::ubi::EdgeName& ptr) {
+      MOZ_ASSERT(ptr);
+      return match(ptr.get());
+    }
+  };
+
+  static bool match(const TwoByteString& k, const Lookup& l) {
+    EqualityMatcher eq(l);
+    return k.match(eq);
+  }
+
+  static void rekey(TwoByteString& k, TwoByteString&& newKey) {
+    k = Move(newKey);
+  }
+};
+
 // A `CoreDumpWriter` that serializes nodes to protobufs and writes them to the
 // given `ZeroCopyOutputStream`.
 class MOZ_STACK_CLASS StreamWriter : public CoreDumpWriter
 {
-  using Set = js::HashSet<uint64_t>;
+  using FrameSet         = js::HashSet<uint64_t>;
+  using TwoByteStringMap = js::HashMap<TwoByteString, uint64_t, TwoByteString::HashPolicy>;
+  using OneByteStringMap = js::HashMap<const char*, uint64_t>;
 
-  JSContext* cx;
-  bool       wantNames;
+  JSContext*       cx;
+  bool             wantNames;
   // The set of |JS::ubi::StackFrame::identifier()|s that have already been
   // serialized and written to the core dump.
-  Set        framesAlreadySerialized;
+  FrameSet         framesAlreadySerialized;
+  // The set of two-byte strings that have already been serialized and written
+  // to the core dump.
+  TwoByteStringMap twoByteStringsAlreadySerialized;
+  // The set of one-byte strings that have already been serialized and written
+  // to the core dump.
+  OneByteStringMap oneByteStringsAlreadySerialized;
 
   ::google::protobuf::io::ZeroCopyOutputStream& stream;
 
   bool writeMessage(const ::google::protobuf::MessageLite& message) {
     // We have to create a new CodedOutputStream when writing each message so
     // that the 64MB size limit used by Coded{Output,Input}Stream to prevent
     // integer overflow is enforced per message rather than on the whole stream.
     ::google::protobuf::io::CodedOutputStream codedStream(&stream);
     codedStream.WriteVarint32(message.ByteSize());
     message.SerializeWithCachedSizes(&codedStream);
     return !codedStream.HadError();
   }
 
+  // Attach the full two-byte string or a reference to a two-byte string that
+  // has already been serialized to a protobuf message.
+  template <typename SetStringFunction,
+            typename SetRefFunction>
+  bool attachTwoByteString(TwoByteString& string, SetStringFunction setString,
+                           SetRefFunction setRef) {
+    auto ptr = twoByteStringsAlreadySerialized.lookupForAdd(string);
+    if (ptr) {
+      setRef(ptr->value());
+      return true;
+    }
+
+    auto length = string.length();
+    auto stringData = MakeUnique<std::string>(length * sizeof(char16_t), '\0');
+    if (!stringData)
+      return false;
+
+    auto buf = const_cast<char16_t*>(reinterpret_cast<const char16_t*>(stringData->data()));
+    string.copyToBuffer(RangedPtr<char16_t>(buf, length), length);
+
+    uint64_t ref = twoByteStringsAlreadySerialized.count();
+    if (!twoByteStringsAlreadySerialized.add(ptr, Move(string), ref))
+      return false;
+
+    setString(stringData.release());
+    return true;
+  }
+
+  // Attach the full one-byte string or a reference to a one-byte string that
+  // has already been serialized to a protobuf message.
+  template <typename SetStringFunction,
+            typename SetRefFunction>
+  bool attachOneByteString(const char* string, SetStringFunction setString,
+                           SetRefFunction setRef) {
+    auto ptr = oneByteStringsAlreadySerialized.lookupForAdd(string);
+    if (ptr) {
+      setRef(ptr->value());
+      return true;
+    }
+
+    auto length = strlen(string);
+    auto stringData = MakeUnique<std::string>(string, length);
+    if (!stringData)
+      return false;
+
+    uint64_t ref = oneByteStringsAlreadySerialized.count();
+    if (!oneByteStringsAlreadySerialized.add(ptr, string, ref))
+      return false;
+
+    setString(stringData.release());
+    return true;
+  }
+
   protobuf::StackFrame* getProtobufStackFrame(JS::ubi::StackFrame& frame) {
+    // NB: de-duplicated string properties must be written in the same order
+    // here as they are read in `HeapSnapshot::saveStackFrame` or else indices
+    // in references to already serialized strings will be off.
+
     MOZ_ASSERT(frame,
                "null frames should be represented as the lack of a serialized "
                "stack frame");
 
     auto id = frame.identifier();
     auto protobufStackFrame = MakeUnique<protobuf::StackFrame>();
     if (!protobufStackFrame)
       return nullptr;
@@ -593,34 +927,32 @@ class MOZ_STACK_CLASS StreamWriter : pub
       return nullptr;
 
     data->set_id(id);
     data->set_line(frame.line());
     data->set_column(frame.column());
     data->set_issystem(frame.isSystem());
     data->set_isselfhosted(frame.isSelfHosted());