Merge fx-team to central, a=merge
authorWes Kocher <wkocher@mozilla.com>
Thu, 07 Jan 2016 16:35:32 -0800
changeset 278970 2c8701e3ee1137873ba976ff73fa45158f44d17d
parent 278953 b4d9c2dd5f7aa41a59138482956400da38b8b9f1 (current diff)
parent 278969 006d6c2675767785e231b708c8716e1f4bff7463 (diff)
child 278999 8a7cc8b7aa556bd50c930f50770fa26661e41c03
push id29862
push userkwierso@gmail.com
push dateFri, 08 Jan 2016 00:35:36 +0000
treeherdermozilla-central@2c8701e3ee11 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone46.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge fx-team to central, a=merge
browser/extensions/loop/skin/windows/toolbar-win8.png
browser/extensions/loop/skin/windows/toolbar-win8@2x.png
devtools/client/animationinspector/components.js
devtools/server/tests/unit/test_setBreakpoint-on-column-with-no-offests-in-gcd-script.js
devtools/server/tests/unit/test_setBreakpoint-on-column-with-no-offsets-at-end-of-script.js
devtools/server/tests/unit/test_setBreakpoint-on-column-with-no-offsets-in-gcd-script.js
devtools/server/tests/unit/test_setBreakpoint-on-column-with-no-offsets.js
services/common/tests/unit/test_utils_exceptionStr.js
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1542,18 +1542,16 @@ pref("experiments.enabled", true);
 pref("experiments.manifest.fetchIntervalSeconds", 86400);
 pref("experiments.manifest.uri", "https://telemetry-experiment.cdn.mozilla.net/manifest/v1/firefox/%VERSION%/%CHANNEL%");
 // Whether experiments are supported by the current application profile.
 pref("experiments.supported", true);
 
 // Enable GMP support in the addon manager.
 pref("media.gmp-provider.enabled", true);
 
-pref("browser.apps.URL", "https://marketplace.firefox.com/discovery/");
-
 #ifdef NIGHTLY_BUILD
 pref("browser.polaris.enabled", false);
 pref("privacy.trackingprotection.ui.enabled", false);
 #endif
 pref("privacy.trackingprotection.introCount", 0);
 pref("privacy.trackingprotection.introURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/tracking-protection/start/");
 
 // Enable Contextual Identity Containers
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -3116,52 +3116,62 @@ function BrowserReloadWithFlags(reloadFl
 /**
  * Returns a string with detailed information about the certificate validation
  * failure from the specified URI that can be used to send a report.
  */
 function getDetailedCertErrorInfo(location, securityInfoAsString) {
   if (!securityInfoAsString)
     return "";
 
-  let details = [];
-  details.push(location);
+  let certErrorDetails = location;
 
   const serhelper = Cc["@mozilla.org/network/serialization-helper;1"]
                        .getService(Ci.nsISerializationHelper);
   let securityInfo = serhelper.deserializeObject(securityInfoAsString);
   securityInfo.QueryInterface(Ci.nsITransportSecurityInfo);
 
   let errors = Cc["@mozilla.org/nss_errors_service;1"]
                   .getService(Ci.nsINSSErrorsService);
   let code = securityInfo.errorCode;
-  details.push(errors.getErrorMessage(errors.getXPCOMFromNSSError(code)));
+  certErrorDetails += "\r\n\r\n" + errors.getErrorMessage(errors.getXPCOMFromNSSError(code));
 
   const sss = Cc["@mozilla.org/ssservice;1"]
                  .getService(Ci.nsISiteSecurityService);
   // SiteSecurityService uses different storage if the channel is
   // private. Thus we must give isSecureHost correct flags or we
   // might get incorrect results.
   let flags = PrivateBrowsingUtils.isWindowPrivate(window) ?
               Ci.nsISocketProvider.NO_PERMANENT_STORAGE : 0;
 
   let uri = Services.io.newURI(location, null, null);
-  details.push(sss.isSecureHost(sss.HEADER_HSTS, uri.host, flags));
-  details.push(sss.isSecureHost(sss.HEADER_HPKP, uri.host, flags));
+
+  let hasHSTS = sss.isSecureHost(sss.HEADER_HSTS, uri.host, flags);
+  let hasHPKP = sss.isSecureHost(sss.HEADER_HPKP, uri.host, flags);
+  certErrorDetails += "\r\n\r\n" +
+                      gNavigatorBundle.getFormattedString("certErrorDetailsHSTS.label",
+                                                          [hasHSTS]);
+  certErrorDetails += "\r\n" +
+                      gNavigatorBundle.getFormattedString("certErrorDetailsKeyPinning.label",
+                                                          [hasHPKP]);
 
   let certChain = "";
   if (securityInfo.failedCertChain) {
     let certs = securityInfo.failedCertChain.getEnumerator();
     while (certs.hasMoreElements()) {
       let cert = certs.getNext();
       cert.QueryInterface(Ci.nsIX509Cert);
       certChain += getPEMString(cert);
     }
   }
-  details.push(certChain);
-  return gNavigatorBundle.getFormattedString("certErrorDetails.label", details, 5);
+
+  certErrorDetails += "\r\n\r\n" +
+                      gNavigatorBundle.getString("certErrorDetailsCertChain.label") +
+                      "\r\n\r\n" + certChain;
+
+  return certErrorDetails;
 }
 
 // TODO: can we pull getDERString and getPEMString in from pippki.js instead of
 // duplicating them here?
 function getDERString(cert)
 {
   var length = {};
   var derArray = cert.getRawDER(length);
@@ -6403,21 +6413,16 @@ function BrowserOpenAddonsMgr(aView) {
     // found the window above.
     Services.obs.addObserver(function observer(aSubject, aTopic, aData) {
       Services.obs.removeObserver(observer, aTopic);
       aSubject.loadView(aView);
     }, "EM-loaded", false);
   }
 }
 
-function BrowserOpenApps() {
-  let appsURL = Services.urlFormatter.formatURLPref("browser.apps.URL");
-  switchToTabHavingURI(appsURL, true)
-}
-
 function AddKeywordForSearchField() {
   let mm = gBrowser.selectedBrowser.messageManager;
 
   let onMessage = (message) => {
     mm.removeMessageListener("ContextMenu:SearchFieldBookmarkData:Result", onMessage);
 
     let bookmarkData = message.data;
     let title = gNavigatorBundle.getFormattedString("addKeywordTitleAutoFill",
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -1136,28 +1136,16 @@ const CustomizableWidgets = [
     }
   }, {
     id: "email-link-button",
     tooltiptext: "email-link-button.tooltiptext3",
     onCommand: function(aEvent) {
       let win = aEvent.view;
       win.MailIntegration.sendLinkForBrowser(win.gBrowser.selectedBrowser)
     }
-  }, {
-    id: "web-apps-button",
-    label: "web-apps-button.label",
-    tooltiptext: "web-apps-button.tooltiptext",
-    onCommand: function(aEvent) {
-      let win = aEvent.target &&
-                aEvent.target.ownerDocument &&
-                aEvent.target.ownerDocument.defaultView;
-      if (win && typeof win.BrowserOpenApps == "function") {
-        win.BrowserOpenApps();
-      }
-    }
   }];
 
 if (Services.prefs.getBoolPref("privacy.panicButton.enabled")) {
   CustomizableWidgets.push({
     id: "panic-button",
     type: "view",
     viewId: "PanelUI-panicView",
     _sanitizer: null,
--- a/browser/extensions/loop/jar.mn
+++ b/browser/extensions/loop/jar.mn
@@ -14,23 +14,23 @@
 % override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-yosemite@2x.png      os=Darwin osversion>=10.10
 % override chrome://loop/skin/menuPanel.png       chrome://loop/skin/menuPanel-aero.png           os=WINNT osversion=6
 % override chrome://loop/skin/menuPanel.png       chrome://loop/skin/menuPanel-aero.png           os=WINNT osversion=6.1
 % override chrome://loop/skin/menuPanel@2x.png    chrome://loop/skin/menuPanel-aero@2x.png        os=WINNT osversion=6
 % override chrome://loop/skin/menuPanel@2x.png    chrome://loop/skin/menuPanel-aero@2x.png        os=WINNT osversion=6.1
 % override chrome://loop/skin/toolbar.png         chrome://loop/skin/toolbar-XP.png               os=WINNT osversion<6
 % override chrome://loop/skin/toolbar.png         chrome://loop/skin/toolbar-aero.png             os=WINNT osversion=6
 % override chrome://loop/skin/toolbar.png         chrome://loop/skin/toolbar-aero.png             os=WINNT osversion=6.1
-% override chrome://loop/skin/toolbar.png         chrome://loop/skin/toolbar-win8.png             os=WINNT osversion=6.2
-% override chrome://loop/skin/toolbar.png         chrome://loop/skin/toolbar-win8.png             os=WINNT osversion=6.3
+% override chrome://loop/skin/toolbar.png         chrome://loop/skin/toolbar-win10.png            os=WINNT osversion=6.2
+% override chrome://loop/skin/toolbar.png         chrome://loop/skin/toolbar-win10.png            os=WINNT osversion=6.3
 % override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-XP@2x.png            os=WINNT osversion<6
 % override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-aero@2x.png          os=WINNT osversion=6
 % override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-aero@2x.png          os=WINNT osversion=6.1
-% override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-win8@2x.png          os=WINNT osversion=6.2
-% override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-win8@2x.png          os=WINNT osversion=6.3
+% override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-win10@2x.png         os=WINNT osversion=6.2
+% override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-win10@2x.png         os=WINNT osversion=6.3
   skin/  (skin/*)
   content/modules/ (content/modules/*)
 * content/preferences/prefs.js (content/preferences/prefs.js)
 
   # Desktop html files
   content/panels/conversation.html                 (content/panels/conversation.html)
   content/panels/panel.html                        (content/panels/panel.html)
 
index 31f3671d4ce3714fcc446f8b7373234684f32be5..d7aaa2f62407957783e17c8d387999c11f937446
GIT binary patch
literal 1475
zc$`&~3sllq9LI5_d3;s&K&MF^n`V-_OvO~lKo{)@E4S=qh0n|~A6Y(9{*+Ek#XQY2
zYfNTXZYPf9Bd29zQ$W)sAEAkcV&)V<m?6Z!KMdR1*3P;2_c`~T@A>_H_n!N`Mc)v=
zvbOl#0tSOw6ZYc|898a3Tg=Uj(UN!mI~dHgn1B!dHp@iLfU{8qyU@j`v*PAYN9n8b
zH&o9X*dg!Z;vi_}{5IE@<>DT~NV`GA8<&5*&9(?Hr4p>u>w6VBW!(*{`Y)GHSE8FJ
z+B3NbrT|p#`LLlEKSnlOE3APi&DppyWX?ib4HWKyi5yFz`=2K19v&p6)W<c7#9&{4
z1KfjV-Pg&?3Ua!tiC$MjF(Zv7DE|Ye3+RIF%3?J*mi0!htK&ac!Rf*OQ><Xe+=w?V
z1*k|U;g{Z3*)xz!KfI*cW_GrwZb+K^8NI1L7MXMB6mzN^gY9&cd*=>fK4RlLZ{l8B
zihqS=+Fn#SInAfdF<_vM>Zgc3<MfvQB&l@XD4k8v)=+51Dl6a&0u$B}hQ|pPxYQJl
zI5`D!C;4bn)l@n>U`;Ze`^K2{OCk0PQJ-6H7C<9CGFUO2gh~QvMV^5!dgbC88H>_*
z?=4k@IF>*|<?~e6KYJ3Mn*HHnBy*~SqJNqv3ocn{a)SC#Nz&jNQb$mlRg&Ow%NCnx
z*<+Q)ZZ~^I1(m8YP|wsY(dW4V`7N?GZF`bI4GnX|bAExn{7T-%EC(P(cC=oD_6@xa
zsh~4TM^s6=@-`b&%T%-MhJT{9swhP4oIYJg02#obar+*UamoGsdz9Xb7HD^&tn;Y*
z)+YI4X?$a*2H1dmBr`uoeqhi6^M&x1wHYxdt#0|~omM}m%Vw2{s2^)pt;vu@`zm!9
zq_1tihqRj9JzC_Q3OM$O8l4qAF*_nD2F$`nO`O^keu}c9sgpDzoTFU%U1E#Z)Aj?0
zB~(NX4}1lkqA5qN9U*fKzj9<F1EOd3Z@JCb%Ex+Y5H;-()|`5|YEwmsWe`(553*u8
zc0u<&wYI}L9YmrW#M*VtzG!q&ln4=5F!`YL^dH$C(-(;g8yn*_EPK9viH{m&>K*|@
zC&p=((cQK!wu%DQBpYo_q{mJw(Z5W9&H!z3YDsI3DJG8zJVRH9b*gK-+?4*P@}9KY
z$&k6oXIk~K`#Z)H-p%szomdPd@&c63ZNJmwF~`>7fZtq<mzLifb8Eq2K!|hKmbJh{
z4+7db62mZJSvH#4KbrGIaL$A_tQ^mil$Tze)lnIuJFk!uvRMSb;RyU@&pZ<|gc6lu
zOc1+TuXd<4drk+=>ABEy<e)y(owHMJP$>!<fX!gN15mJ)B|VF_;qS6}O=HD$M~ME^
z>g~~<o8k`!2GvP6YvOqYl?chmB6Yq*_Y`){0_bQkY4(bX$+aEfnPsq|HJGCHvHLCk
zy4Jjy2J@xXEg1cAk-$B*Bbh=BmMmTgsE*(T#x47s-UWqj+vVvN2S7$%9spvyCyHmb
zv#V#1x4}{bh<u@4r!)@jSyvoeU0WcQ4vZFMK;krP8)C`JRdIPqu$&#+EJJ`!Ud=*>
zMq@5xpuDc!DPQ6*9MAzUXsx3AoOuOL*y2`Iklj6xEsl^v+8qE5K5dTn?Jw??(nEAs
z)$iWh?@MHEy}tYrY__B;!>TM^wW^M(Hj{Ph=_eB@GfTC={Kx<kz}2%0L$Yl~y6l~i
zC&p&ql`s24HO2>@$Q&XWm-m|_c%cm%MH{CJrr78J;$?l6rz*P*$>9sU@(g6GI-EO4
z<fa{IuD^+$x{(#56cqTyV9hcO36qQU+gI$;B%E`V|LY#|1&RS@N8?0?V=je#2-7+r
sF8JH|%uk^6y;OwX7rc3W(f3!lFc#xM&mi6fWBi<9gb*UWZeLX1Uof8?7XSbN
index f52cf225fd8f981fd5e2710042034c7591806eb9..505a4b13b8a8feb46e199c869217d82cdcfd38d8
GIT binary patch
literal 3144
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
index 31c0256b3e321dedfdc8d11a86b982b99eb52cfd..0eaf78fc3a43bece27deeb8645b60ad67d774bc7
GIT binary patch
literal 2551
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
Kjouh|-2E54kN)of
index 1178851df12624df8d04571b3195693c60718bad..b6462d52a3099d924681da7e9b8c6489cfbaa153
GIT binary patch
literal 5323
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
TCiWBpNQbJD=9ALL=E461HJpdy
index 8ba10aab2339e7978c41bd52360ca4e261ffeacf..188d92816ad66d64641192bebab07fe4203b344d
GIT binary patch
literal 3974
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
OIz27u?b2HhpZ*W2tiM|T
index c1fc1de1abb6ce7a4f1700f8a43b463af5e15164..6cea68ec5b1bf9cf291614d954e83a04897a4a41
GIT binary patch
literal 10115
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
index 1d0cb991a657cd9110ee8de3d421a7c8bea79662..5e74e2864bc3949a85814710080982534ca8eccd
GIT binary patch
literal 4424
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
VlQ&j)?=%5OhnAY2Dnc0^{C~pYmNozY
index 612f0e26691baa674152dc4c35ff9e4bdad3a7b9..591bf14da3b6d224506a6abd72d71b6aab3e65e8
GIT binary patch
literal 8735
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
Rx&gSKqMVv+=~MIIe*=*-XBz+j
index 779640ee38eedbfab0ccaf0f143b2c9d9c59d368..e9f88f9d8ca6b319050b956f744835379275e06f
GIT binary patch
literal 8025
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
index 733414ba8f04bd18b97f1c23e9cd73ec4f800fbf..0118ee233cf25b492632d4175c6f899e41e90be5
GIT binary patch
literal 19003
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
index d0bd6e5abda61f6117d047d8c7441eeea7cd8356..de040d6f1b09d5b24803e1759d6ba89d551d8b36
GIT binary patch
literal 3568
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
TSzC!eITAfBBh4E1$5H<QMV%RI
index b1bff2d4fdd956b29e4052a55faae46cbbde82f8..ec6e4b4c2ce147c7548d2dd4a4a9e9c61bb8cc38
GIT binary patch
literal 7855
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%0DGX%7?%7;1%Pnn>21
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
Soj#J0K8kWmvbiq|eEtV+7cC_K
index b68363b432a1f02b29c01d00ebf1ee385a39f3ac..13bed18154cf354fcd4fd417fb55f19ff8fc2be1
GIT binary patch
literal 2135
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
index 57a9e688d1f4176dbb70d7236e2508cb9cbabc82..362cc1750bdd74870c81b5957b9f0bd03b4024ee
GIT binary patch
literal 4500
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
index 1d45fe92e15a5de26e8222d43e0c6040001127f4..6c8b0103df96eedfaa14101b1d57614f539bcf92
GIT binary patch
literal 3861
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
NkjFae<*NS<{SSS5zR>^x
index 026765c0040b5fd5162074f705b0b4d55f1644ca..bb928dbe845226af92ac113861c4e9eb82231bba
GIT binary patch
literal 9729
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
index cfb51d6b69ea480d89ea371bb1fb273fedf2b137..033e647883b7d337376ecb2549aa11540437b7ce
GIT binary patch
literal 7871
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
TgVG}u<V#LUNwWN{aq#~D@K$`D
index 90f3bf5a8c9b25615afeaeb4f247d050daee2d79..31d992c28e35877cddc48a00106d0ef709509fcd
GIT binary patch
literal 21794
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
index 31f3671d4ce3714fcc446f8b7373234684f32be5..d7aaa2f62407957783e17c8d387999c11f937446
GIT binary patch
literal 1475
zc$`&~3sllq9LI5_d3;s&K&MF^n`V-_OvO~lKo{)@E4S=qh0n|~A6Y(9{*+Ek#XQY2
zYfNTXZYPf9Bd29zQ$W)sAEAkcV&)V<m?6Z!KMdR1*3P;2_c`~T@A>_H_n!N`Mc)v=
zvbOl#0tSOw6ZYc|898a3Tg=Uj(UN!mI~dHgn1B!dHp@iLfU{8qyU@j`v*PAYN9n8b
zH&o9X*dg!Z;vi_}{5IE@<>DT~NV`GA8<&5*&9(?Hr4p>u>w6VBW!(*{`Y)GHSE8FJ
z+B3NbrT|p#`LLlEKSnlOE3APi&DppyWX?ib4HWKyi5yFz`=2K19v&p6)W<c7#9&{4
z1KfjV-Pg&?3Ua!tiC$MjF(Zv7DE|Ye3+RIF%3?J*mi0!htK&ac!Rf*OQ><Xe+=w?V
z1*k|U;g{Z3*)xz!KfI*cW_GrwZb+K^8NI1L7MXMB6mzN^gY9&cd*=>fK4RlLZ{l8B
zihqS=+Fn#SInAfdF<_vM>Zgc3<MfvQB&l@XD4k8v)=+51Dl6a&0u$B}hQ|pPxYQJl
zI5`D!C;4bn)l@n>U`;Ze`^K2{OCk0PQJ-6H7C<9CGFUO2gh~QvMV^5!dgbC88H>_*
z?=4k@IF>*|<?~e6KYJ3Mn*HHnBy*~SqJNqv3ocn{a)SC#Nz&jNQb$mlRg&Ow%NCnx
z*<+Q)ZZ~^I1(m8YP|wsY(dW4V`7N?GZF`bI4GnX|bAExn{7T-%EC(P(cC=oD_6@xa
zsh~4TM^s6=@-`b&%T%-MhJT{9swhP4oIYJg02#obar+*UamoGsdz9Xb7HD^&tn;Y*
z)+YI4X?$a*2H1dmBr`uoeqhi6^M&x1wHYxdt#0|~omM}m%Vw2{s2^)pt;vu@`zm!9
zq_1tihqRj9JzC_Q3OM$O8l4qAF*_nD2F$`nO`O^keu}c9sgpDzoTFU%U1E#Z)Aj?0
zB~(NX4}1lkqA5qN9U*fKzj9<F1EOd3Z@JCb%Ex+Y5H;-()|`5|YEwmsWe`(553*u8
zc0u<&wYI}L9YmrW#M*VtzG!q&ln4=5F!`YL^dH$C(-(;g8yn*_EPK9viH{m&>K*|@
zC&p=((cQK!wu%DQBpYo_q{mJw(Z5W9&H!z3YDsI3DJG8zJVRH9b*gK-+?4*P@}9KY
z$&k6oXIk~K`#Z)H-p%szomdPd@&c63ZNJmwF~`>7fZtq<mzLifb8Eq2K!|hKmbJh{
z4+7db62mZJSvH#4KbrGIaL$A_tQ^mil$Tze)lnIuJFk!uvRMSb;RyU@&pZ<|gc6lu
zOc1+TuXd<4drk+=>ABEy<e)y(owHMJP$>!<fX!gN15mJ)B|VF_;qS6}O=HD$M~ME^
z>g~~<o8k`!2GvP6YvOqYl?chmB6Yq*_Y`){0_bQkY4(bX$+aEfnPsq|HJGCHvHLCk
zy4Jjy2J@xXEg1cAk-$B*Bbh=BmMmTgsE*(T#x47s-UWqj+vVvN2S7$%9spvyCyHmb
zv#V#1x4}{bh<u@4r!)@jSyvoeU0WcQ4vZFMK;krP8)C`JRdIPqu$&#+EJJ`!Ud=*>
zMq@5xpuDc!DPQ6*9MAzUXsx3AoOuOL*y2`Iklj6xEsl^v+8qE5K5dTn?Jw??(nEAs
z)$iWh?@MHEy}tYrY__B;!>TM^wW^M(Hj{Ph=_eB@GfTC={Kx<kz}2%0L$Yl~y6l~i
zC&p&ql`s24HO2>@$Q&XWm-m|_c%cm%MH{CJrr78J;$?l6rz*P*$>9sU@(g6GI-EO4
z<fa{IuD^+$x{(#56cqTyV9hcO36qQU+gI$;B%E`V|LY#|1&RS@N8?0?V=je#2-7+r
sF8JH|%uk^6y;OwX7rc3W(f3!lFc#xM&mi6fWBi<9gb*UWZeLX1Uof8?7XSbN
index f52cf225fd8f981fd5e2710042034c7591806eb9..505a4b13b8a8feb46e199c869217d82cdcfd38d8
GIT binary patch
literal 3144
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
index c4d6b950d5fedb6957efd7c31589e5439b05c1c2..126e2722ecb8751f02e4e8b61ab4cd535615e50e
GIT binary patch
literal 3904
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
P@i}b`ef0`8+lc=GF`>G}
index 8372dda3d73a55569b0ad46d0af47f808deda241..35f08fddbfd378b77707b1be087468b262bf6d53
GIT binary patch
literal 9721
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
T>oA6c`Mi}?epU4H<JbQIM;F8`
index 93497bc30269fb68c0d1da36ebe2c070d76fb25b..0a62a2648624cd69b9849798b5d1e3666676fa55
GIT binary patch
literal 3988
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
TY=ic<O?O+@=$~3`=O_OGy0zT-
index f4e7e1e7af9696db86b8b545772ba06eb2de15f6..07f8fecade57c6f6104e38f3560850cc3c8ef7a2
GIT binary patch
literal 9845
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
Z{aZHX5Bf;$OmVPZ3bLxti~lwa{C}M1AT9s^
index 31c0256b3e321dedfdc8d11a86b982b99eb52cfd..0eaf78fc3a43bece27deeb8645b60ad67d774bc7
GIT binary patch
literal 2551
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
Kjouh|-2E54kN)of
index 1178851df12624df8d04571b3195693c60718bad..b6462d52a3099d924681da7e9b8c6489cfbaa153
GIT binary patch
literal 5323
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
TCiWBpNQbJD=9ALL=E461HJpdy
index 318753d0d422c06a0d6596ff8c0d11f02401fbe7..f96cb6f3b318f5f24546a87a7331a6fdf5264b13
GIT binary patch
literal 4001
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
index 0035bc3a5f9647150dcd8e11b0a538b5c6ce6547..826534923bf05c8aac8faa7b44685b6b3a98ffea
GIT binary patch
literal 9915
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..59337608dd99609eaa474c2f380ce8c3b717376e
GIT binary patch
literal 768
zc$@(M1ONPqP)<h;3K|Lk000e1NJLTq004df000sQ1^@s6ofT@S0008VNkl<ZcmeI0
z1B_i=6h=F>ZQHhOH>hnRPVG3UZ3ngOpw?g8Zhxy<Np_Q+mv_!+NB7N_tQ_2%l{xuF
z=Ov2FBqS<yqix%^Q4GzY2h@Rl^5_|yg-vh}zJo6&p1J@2Z{nFY?tzJ?V8KEro~2vX
zn0S)p&mAXERPGhBCY5)zE5NWG>VYq(p%*-HJU8)Bx`~I<O+1ut;-PdC52eT1lUS8r
zn&G@pqEb)ZEe)a3p4Tt|%0pVAyzIU9c_>|bbW%a;n0`H!ZgMV4H}O!qiHFkT<w-21
zr(xIw+0@JbgHGsPHrNem)SmY2gVHb?uEU?gb=fNo`?N=uu05ei1t~)}wMUh1axO|Y
z@ld*nhtlKiNi3U#ppbfLI;51*w^tYj$y|G`KqvSFu6&Yru6R7*l1>O0?Xf>sKs>tm
zZlH4tzQIY~o}{~s+A{_I18?M=$qtVzX#_{aV{op(dQ|b{L1z(6g2lc)N%=7IqY%>^
zb9h`y38}ylug80?Nb)3gT<eO%bl;xJzn<%1Op-K~o;2Wzcnr=JWKUvQTvZPS!gM$a
zui&fj3J$|GdFN+t%cwn#A*QMC@VIhXa6~)?=L)hXsVp`_b(s%=x}Lw$$>FS8Z;?@Z
zro%yxL%XJXJic#~Q;z52F*sL%J&9$p93IQO8f=5?5Sr}rtg5UZ!7`a^Pes@cnZT8d
z@=isMCtUvb98!4<&J|RTd~&Bhz&WArhQGsZxGC$>&`w>Y-a$iouA@D#VZL}C$nzrN
z83j3A9`5qW6N5NB+~rNq#a-US!(HCQ!(BdJp3skMS26U1=yC>nd44KQJd|(Zp?nh$
z<(qgY-^4@tarPuurRQVlBFpoz9v;FM_zUjKUTdiDDc!_F=_VdZH}O!qiHFinJd_?U
yPf|4>2^(QE9EZ3j_?{qm_*EZyBoL{^C-4JMq@6f>$x7`20000<MNUMnLSTYpx^T+?
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b87e1ffa3265f63cf6ecc0acadc5343718919fcb
GIT binary patch
literal 1599
zc${rjeKga180YHB?dD~9z07aiG%F(ErrM8EYgfuF%9ZA2b%|t?jBR(6UY3&Gjw5n2
zHKnd3N)q!jYevMnxW@82@0uB7BXO70=?~|A&-e3u&-tG7{XC!NIp61blD)mq+Urc$
zsi~=Hd;Gfpi0WKa!AeV0WuMmhZBkRy)b!ZD*Ee2W(ydWo<pJf(%$}YVm7cx(#i(|`
z`>xU*F6>t^y@7;>rAKhBw9nOXv!1SZ8cxaHP56!%2_LR$ZdqCOSG+~B9k{<_+jTw*
zjI_Of;{1zOhl|&;>HgPZSd__y83Gpc%Xaqh#iYRxqh^uvfixCn`^|A)S6aT}G}Cyd
zyz+HGR)$8j>4HU5!W%FiVy4I2KTE7ftwQc(wA&PPu8NJkPC}eYBibhHvD9zph8V8`
zgUuhSi4i!mPh7LPg)*?IO)rD+v>dS@^!zHwttj%fOm1LShF_7{fN-}^H?cM}kBO|R
zvsSKiEc)&tR^z6F-bM$lzul=WA495K(~AJk7Cf#k2&Pl<c!c-OCFUM_=hWMGOS?$u
zyHqo3u1TJxz?$)h_#>PXDj@=?d)_{zbAh=DAG1ci0(d;EyMxZP8z)B#RdKCAU*fT^
zn`Z%^lcajyZ^{n?4)h@oB}w4@h?JTS^^_)?OIvNsmOJ>gP1StGgLF|PXrI9;d8uZz
zD8ePB3Omn(tpej5Zfs62Ebq!#Kgo|8dCZ?oIFSiN#bH}+h;Y8TuPPn`QHnRzHnS!8
z;JpCA`o3um)iq{`lrluraB7{its~mH-w(Ll|J%o&lP{mA?qFA;mu9BH4b-+o`Ur{8
z-01Y+zUZWjkw}V#>d%QbH|A~%#eW*3ka*N<=fpC*6!61j1VeJQ&t{ETiai9s@PED&
z+?)?|wqR*_wpTvi^ODR%q?Y5AbeK6M(r+&f7IBav9QhI=LY*6Y{29W{=a;5|7ks@A
zAZD}}M;@x=%E5n_8H+$~+R-JAJK<=tA2KDFFGh3_9u-vb!g?(VX<~u?L^XG}Tq{11
zMg4<uuI~xA!~m$dS)Y5o^;PS$a$Z;rq+@uOTv&K_x+i1-2ygLBU`QK&{<wv{KuSoL
zOS|Fo<OZn>43F$QX!SDPD98E0i8F%&eT6+cS{j`r-P{1ay_lob?NyVVsoU|6Cvh<<
zKU|`Wv>52JpaUXY@?xl8jfxn%LX6c}91%Q)HM?&tsS7F74Z<58%Z-20o|$Y<)YU<G
zI&pSh-S_D=FN|+dXnwLiP53Q9-tEfNiCeXEyA5>vtPhDk`d`KopzC7EY@OH$3@n8)
zX51r>9xd)hyO?qSu89yc2AO9MDwM$N)n!^sT%K&&we9yQXg(*leG0nWTj83wH@k2I
z(uVdua{(PmX+~uGP$T1Pjnvt?Ag#qP&dGR|J=}C>YyQY(4TeFx50Y@}8q=w?7llYF
zA6A+;LrBgthpc@#h+R@>7qeWso^8Y~R~oQ)DTD<k0j27<TNU-Rz-d*=mlWI}PGh>@
ztfkkRilWZKcmdHSDEUcnR$-W3YTXF2a~m?XE`+Ldp3MTpJ+(5eIlZ~dWJ`+bg2gnh
z&I|O_{c2p_Gi}>&H==~*<KtrU#p~9xoq4%hoad)6_PcBV*B2AS#~;5K3s1qwtfI8%
z*9PCcvGLE;0zMnOAW*4E46H&&GUgd&6vK*IB)&+8v*jXUMpz*<{#xcWR3*f*7|MxY
z?WBb4SdYpV08wNg#wRGXYzPI~N0G7MhiMk2Y)F6HVcGJwA=y6}$~q3b61y8%HmO?F
zC~6h-#~ScqqTK_T9xmSp)gpVv)ITt`U^o|srMa?%7?(BKds13e4=Zkr_mfnOLt>Xt
zU#Sl&9`qk2nRJDGI?Ojz{vdvDEb)dN)r-_N!XGI~bY`f&<KzrDyu8)#N=C!uOVu)m
zNj_b8A(5(5*Ns|52!6?0_9e{J<{nOj)wUHCgW{_Sq%?8B&0I=mx=k@h<~5|`9yb(A
WD36`hoKOu0H4l{6{zCWQr2haK+C47-
deleted file mode 100644
index 5159731dee2b30c0e966a06c41c6ef0805d95c11..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index c1fc1de1abb6ce7a4f1700f8a43b463af5e15164..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index cbdb15d034657eb99a2bc32fa41ce93fd12cb432..04aab76ca3b1a11c967afa8b6843776a20e6bf7b
GIT binary patch
literal 752
zc$@+70uTL(P)<h;3K|Lk000e1NJLTq004df000sQ1^@s6ofT@S0008FNkl<ZcmeI1
z1FT#@7)EQ`wr$%+Slez`V`C?^t)RAT+qP|<B>zh$H?#BfSNH9goQ!r)-sG$9ZLCmY
zW@39chL0K-o1p=;hpLcWj_$&KSOS~jC%B^G>2dg=if8=L>nfgHxpJ#`rZ1bP;)$Ch
zOO!mZv&>>G>3nN^PKJe09bDN99pN_EqT-=+6%VDWcqm=PL+L6WN{^yPikH%hFzkZ#
z5Rp8ET5ti(n4U*45!S*DInM*lVIX7*=ArapKTl$a4Id)%^H93Vy(nG9L+L6WN{@y|
zil_9X%+Eq@2+LQ94<zW`4JZNcWo>#kKnHjUwxotd(8TMZbkpNa8W~@B54;{qSGgCZ
zt9U3~#Y5@Q_Qa8mo*qd663OV=%Ol^7<?)<?*1<}byp+$Ja(HY>E?8oC6z=6`PgwD7
z!OR}`0lQs$l6Eqhp0V%+oRQCrad>P=D%c|)g?sth6HgW;z|0g_1Rb1v@?Fb(J47@)
z93EQ|*`7wc-&MGmuRZaCJk}L}fNRglXBov4>BNhqC#lmW9))}P+7nL}r=fz(dq57T
z3Pm7;>_35XZ~*SYEZM&#qv@#wYat@3;qcfWO<WO=!oB?KF^XSmh<Zac$KTNjV85|m
zCZp*Iz-EWTbOjt9*DsVkV2OAX?&W7s99hhSTQV;XD<A`SlR?hP$@(VDkh$q81uG#n
z1WPLUOeu%QmamRW8Xkpv`Pk!nf%6vD8ZQotKyyeQ#TPi&<vedxU*Ndoc!8sEFP`O9
zJUq**czBkNmdE?bb`C>V2rv7fqvLm_iih%5Je05Ep?nn&<*RroKgu5ScYJpFi$4h*
zm3dXj0bk$&9E7E?$?=~DDjrH#@ld*ohtgF%l&<2T^k{kF8S??KSU$KDqMDHBpZCb`
i_?VYa;y?^cD8B%-Is7F^jj&b#0000<MNUMnLSTZewPC*i
index 1e988bebd29e8760f3c925ad09cbfeef898fefe2..d9cc5d56fc7039e123ad63b891a49d77d20b1116
GIT binary patch
literal 1597
zc${68eKga19LL9S$-|V#G*eBX(vu@&ep03y!VRe;G9}#_qCJw!RhyKZj@un!>bfVl
zVY57}V~cec(}Q+hCl7nLtkgU-M%%TJdw)6iFXwz;pYQpc^Z9<?-}621&-Ys#9eLP#
zjmsJc1Y(Unf;k4xOCav%W?*dWj^6@-n3-TP2VzM^8YT2r>PdUrY~!Sh{G+VxvV3JE
z;H1xSa#nJmvUOyGw70U7*#5VYNLXAdOJW~epF6><6gW5Fnujm#tJLH_fnx+;+63)$
zSIh~|x-T#e(c8>p_85Pi1-g-AvHB{%rcO3Xz(v%t>$255*_1QO<KA(=Iaj%v=0$5>
zV^2wbTBHyyeT97jM;~}>L~?X{ur56!4n{k@iojULk|=wK`0<19rNU$T;OYna!z$Pa
z8^J25bi|he^?l~-6}#z!M(GW3qH0rY@ZLB8p0f&F1SJI)NPFtItL9y1(GVYn$lv@T
z7YNn;!5uH=m6x2lP#QVpx`=~~g=thx;T=KNJd-|`<Sbc|8>po2Ivf91yn^(;#9#ZS
zciFTwxF_!?T(r^1z(CA%ImuppC$(~vQdJCp4!{W$gLMw)k*6%RK~K3bTH@Q!@0#i-
zRV$>)%4mXw;0Ud2fqXP6SDN~X*1QLf^@FG3_D6&@N;+jHcmZcSgXZG6h^ZH7{^CQS
z!e+$Ls6m%O+`dmDa~$+>LDz0zx8sLQYqtQ3=~q<D4`V{+Yq?m%nIvZkKoJ6XQVomD
zpo;h3a-k=zb*l9eQG?2^q0@Y|8&e$RKG4OKfG}mwr;_#W5W|x_8Kiv1vicmbK&i^7
zsR>C;W?v5y&wU@*&@q_F(aHU{r{vudPnJyiTa6%lU2o2eYE%RwWnIQD9i|27gBEtp
zXA0^mXB5+H$`fUr9!$nx;JQkQxGL+g2_K?A97e=TA-Rl}dBE%l)ueu=gZWzX{i0Ae
ze}ZAx1k06g>XIrnWuwi5YcF!c!2)%MQ*VE*hCDIDV;LX66k{OR+!%Gh2q0;e9n~3?
zTMZ3<2OIf9k58RqOG-}QuCKtrd${4e)|=)uYkTv;js?Q9Z@6~Yy-4Ps&Pcwhod1<f
zX#u{K#r&9a8#D4|;7_t!asZ3D3|=y>>*J>S-f-<nkD^nD)1$_dNOnz<YJDsdp%%eH
z6g!{Clozt`>sTT(UEX9;qbZG+hscmaiJm)&9;u&ozf;aEP#Zv7C~f(PnZ5xjAyuX7
zKInTM#Nm~<2$dsgMp;kQ`f&7c8QvlY?eu`aY4BJw0WPkndnI>uh@d@Z_0>0=_Sn`k
zsj$B^^!`x}eb?w4&9DW{Y~i{e8cQ`<T(90Jn?jiv`UBf)zAenc8~ErE|9ecgQI6G2
ztrxrfA<6Ar<~;O}IPtW!{sOIK0KwflLB1@hX3o=zh=)+nB>mayvMI1L?K~o*-)5_@
zX^$o!l?Nt<Mj`5F&i^b{wi`^nHzryx6<$?w;C{&SJm9hxP4XsR)@~r(oi{&T;80(b
z%t9QMhUYW%q-*<^s)dT{PmYR14K`SU^O-rtOQH&I06l7<zQ2L}I8SR9fTbFI^;tki
z-fc@;%{jQ~zb3%aJxZLkBq@f=ru`pk(xZ%~r^WkF#?vxYg4MHx@f&+Q54RW(h&xc0
za&k)NvpjlDXPw<OaRMpA@Llq0n$Mjmo`jDynq2}GYM6S@PqSaw#@DEJ8xC7JB2R_b
zesEi~k*K2FE4X#^X#)bf+a}w#(R8581_h@g<1fPaLV4Lg7(g+{W;yYNYy_Sh2PPGI
z!?NuwGvVtH>)%>8vqVQdX{l@qO1GK{oqbcAYuT08nWt|ev^!!M`V$QO7?6+ATOYwe
zv$nNmrntv|O~_%><cV=GKKNSUiJ-uAh2Gwl-_Nr+KH{t>E<o9%ads^sI7|XP-I+C)
z)QbZR`m#atx$}d|=e@>_vwqi}SsE<v8u)dqH~Q9TJ{m8Pven?wsY=)p{7W-pipOf{
ow$8ZqXzOzSY_~I7yFz(BWU6FHclD5H5&RY)*w9D}=U{T-e^n?d+W-In
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -794,21 +794,21 @@ muteTab.label = Mute Tab
 muteTab.accesskey = M
 unmuteTab.label = Unmute Tab
 unmuteTab.accesskey = M
 
 # LOCALIZATION NOTE (weakCryptoOverriding.message): %S is brandShortName
 weakCryptoOverriding.message = %S recommends that you don't enter your password, credit card and other personal information on this website.
 revokeOverride.label = Don't Trust This Website
 revokeOverride.accesskey = D
-# LOCALIZATION NOTE (certErrorDetails.label): This is a text string that
-# appears in the about:certerror page, so that the user can copy and send it to
-# the server administrators for troubleshooting. %1$S is the visited URL, %2$S
-# is the error message, %3$S is true or false, depending on whether the server
-# supports HSTS, %4$S is true or false, depending on whether the server
-# supports HPKP, %5$S is the certificate chain in PEM format.
-certErrorDetails.label = %1$S\r\n\r\n%2$S\r\n\r\nHTTP Strict Transport Security: %3$S\r\nHTTP Public Key Pinning: %4$S\r\n\r\nCertificate chain:\r\n\r\n%5$S
+
+# LOCALIZATION NOTE (certErrorDetails*.label): These are text strings that
+# appear in the about:certerror page, so that the user can copy and send them to
+# the server administrators for troubleshooting.
+certErrorDetailsHSTS.label = HTTP Strict Transport Security: %S
+certErrorDetailsKeyPinning.label = HTTP Public Key Pinning: %S
+certErrorDetailsCertChain.label = Certificate chain:
 
 # LOCALIZATION NOTE (tabgroups.migration.anonGroup):
 # %S is the group number/ID
 tabgroups.migration.anonGroup = Group %S
 tabgroups.migration.tabGroupBookmarkFolderName = Bookmarked Tab Groups
 
--- a/browser/locales/en-US/chrome/browser/customizableui/customizableWidgets.properties
+++ b/browser/locales/en-US/chrome/browser/customizableui/customizableWidgets.properties
@@ -110,19 +110,16 @@ loop-call-button3-participantswaiting.to
 loop-call-button3-pb.tooltiptext = %S is not available in Private Browsing
 
 social-share-button.label = Share This Page
 social-share-button.tooltiptext = Share this page
 
 panic-button.label = Forget
 panic-button.tooltiptext = Forget about some browsing history
 
-web-apps-button.label = Apps
-web-apps-button.tooltiptext = Discover Apps
-
 # LOCALIZATION NOTE(devtools-webide-button.label, devtools-webide-button.tooltiptext):
 # widget is only visible after WebIDE has been started once (Tools > Web Developers > WebIDE)
 # %S is the keyboard shortcut
 devtools-webide-button2.label = WebIDE
 devtools-webide-button2.tooltiptext = Open WebIDE (%S)
 
 e10s-button.label = New Non-e10s Window
 e10s-button.tooltiptext = Open a new Non-e10s Window
--- a/browser/modules/BrowserUITelemetry.jsm
+++ b/browser/modules/BrowserUITelemetry.jsm
@@ -87,17 +87,16 @@ XPCOMUtils.defineLazyGetter(this, "DEFAU
 
 XPCOMUtils.defineLazyGetter(this, "PALETTE_ITEMS", function() {
   let result = [
     "open-file-button",
     "developer-button",
     "feed-button",
     "email-link-button",
     "sync-button",
-    "web-apps-button",
   ];
 
   let panelPlacements = DEFAULT_AREA_PLACEMENTS["PanelUI-contents"];
   if (panelPlacements.indexOf("characterencoding-button") == -1) {
     result.push("characterencoding-button");
   }
 
   if (Services.prefs.getBoolPref("privacy.panicButton.enabled")) {
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -885,20 +885,16 @@ toolbar .toolbarbutton-1 > .toolbarbutto
   #sidebar-button@toolbarButtonPressed@ {
     -moz-image-region: rect(18px, 684px, 36px, 666px);
   }
 
   #panic-button@toolbarButtonPressed@ {
     -moz-image-region: rect(18px, 702px, 36px, 684px);
   }
 
-  #web-apps-button@toolbarButtonPressed@ {
-    -moz-image-region: rect(18px, 720px, 36px, 702px);
-  }
-
   /**
    * OSX has a unique set of icons when fullscreen is in the checked state.
    */
 
   #fullscreen-button[checked="true"]:not([cui-areatype="menu-panel"]) {
     -moz-image-region: rect(36px, 432px, 54px, 414px);
   }
 
@@ -1056,20 +1052,16 @@ toolbar .toolbarbutton-1 > .toolbarbutto
   #sidebar-button@toolbarButtonPressed@ {
     -moz-image-region: rect(36px, 1368px, 72px, 1332px);
   }
 
   #panic-button@toolbarButtonPressed@ {
     -moz-image-region: rect(36px, 1404px, 72px, 1368px);
   }
 
-  #web-apps-button@toolbarButtonPressed@ {
-    -moz-image-region: rect(36px, 1440px, 72px, 1404px);
-  }
-
   #add-share-provider {
     list-style-image: url(chrome://browser/skin/menuPanel-small@2x.png);
     -moz-image-region: rect(0px, 192px, 32px, 160px);
   }
 }
 
 toolbar .toolbarbutton-1:not([type="menu-button"]),
 toolbar .toolbarbutton-1 > .toolbarbutton-menubutton-button {
--- a/browser/themes/shared/browser.inc
+++ b/browser/themes/shared/browser.inc
@@ -1,13 +1,13 @@
 %filter substitution
 
 % Note that zoom-reset-button is a bit different since it doesn't use an image and thus has the image with display: none.
 %define nestedButtons #zoom-out-button, #zoom-reset-button, #zoom-in-button, #cut-button, #copy-button, #paste-button
-%define primaryToolbarButtons #back-button, #forward-button, #home-button, #print-button, #downloads-button, #bookmarks-menu-button, #new-tab-button, #new-window-button, #fullscreen-button, #sync-button, #feed-button, #social-share-button, #open-file-button, #find-button, #developer-button, #preferences-button, #privatebrowsing-button, #save-page-button, #add-ons-button, #history-panelmenu, #nav-bar-overflow-button, #PanelUI-menu-button, #characterencoding-button, #email-link-button, #sidebar-button, @nestedButtons@, #e10s-button, #panic-button, #web-apps-button, #webide-button
+%define primaryToolbarButtons #back-button, #forward-button, #home-button, #print-button, #downloads-button, #bookmarks-menu-button, #new-tab-button, #new-window-button, #fullscreen-button, #sync-button, #feed-button, #social-share-button, #open-file-button, #find-button, #developer-button, #preferences-button, #privatebrowsing-button, #save-page-button, #add-ons-button, #history-panelmenu, #nav-bar-overflow-button, #PanelUI-menu-button, #characterencoding-button, #email-link-button, #sidebar-button, @nestedButtons@, #e10s-button, #panic-button, #webide-button
 
 %ifdef XP_MACOSX
 % Prior to 10.7 there wasn't a native fullscreen button so we use #restore-button to exit fullscreen
 % and want it to behave like other toolbar buttons.
 %define primaryToolbarButtons @primaryToolbarButtons@, #restore-button
 %endif
 
 %define inAnyPanel :-moz-any(:not([cui-areatype="toolbar"]), [overflowedItem=true])
--- a/browser/themes/shared/menupanel.inc.css
+++ b/browser/themes/shared/menupanel.inc.css
@@ -153,21 +153,16 @@
   toolbarpaletteitem[place="palette"] > #panic-button {
     -moz-image-region: rect(0, 896px, 32px, 864px);
   }
 
   #panic-button[cui-areatype="menu-panel"][panel-multiview-anchor=true] {
     -moz-image-region: rect(32px, 896px, 64px, 864px);
   }
 
-  #web-apps-button[cui-areatype="menu-panel"],
-  toolbarpaletteitem[place="palette"] > #web-apps-button {
-    -moz-image-region: rect(0, 928px, 32px, 896px);
-  }
-
   #webide-button[cui-areatype="menu-panel"],
   toolbarpaletteitem[place="palette"] > #webide-button {
     -moz-image-region: rect(0px, 960px, 32px, 928px);
   }
 
   toolbaritem[sdkstylewidget="true"] > toolbarbutton {
     -moz-image-region: rect(0, 832px, 32px, 800px);
   }
@@ -363,21 +358,16 @@
   toolbarpaletteitem[place="palette"] > #panic-button {
     -moz-image-region: rect(0, 1792px, 64px, 1728px);
   }
 
   #panic-button[cui-areatype="menu-panel"][panel-multiview-anchor=true] {
     -moz-image-region: rect(64px, 1792px, 128px, 1728px);
   }
 
-  #web-apps-button[cui-areatype="menu-panel"],
-  toolbarpaletteitem[place="palette"] > #web-apps-button {
-    -moz-image-region: rect(0, 1856px, 64px, 1792px);
-  }
-
   toolbaritem[sdkstylewidget="true"] > toolbarbutton {
     -moz-image-region: rect(0, 1664px, 64px, 1600px);
   }
 
   /* Footer and wide panel control icons */
   #edit-controls@inAnyPanel@ > toolbarbutton,
   #zoom-controls@inAnyPanel@ > toolbarbutton,
   toolbarpaletteitem[place="palette"] > #edit-controls > toolbarbutton,
--- a/browser/themes/shared/toolbarbuttons.inc.css
+++ b/browser/themes/shared/toolbarbuttons.inc.css
@@ -162,20 +162,16 @@ toolbar[brighttext] #bookmarks-menu-butt
   -moz-image-region: rect(18px, 702px, 36px, 684px);
 %endif
 }
 
 #panic-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
   transform: scaleX(-1);
 }
 
-#web-apps-button[cui-areatype="toolbar"] {
-  -moz-image-region: rect(0, 720px, 18px, 702px);
-}
-
 #webide-button[cui-areatype="toolbar"] {
   -moz-image-region: rect(0, 738px, 18px, 720px);
 }
 
 %if defined(XP_WIN) || defined(XP_MACOSX)
 @media (min-resolution: 1.1dppx) {
   :-moz-any(@primaryToolbarButtons@),
   #bookmarks-menu-button > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon {
@@ -333,17 +329,13 @@ toolbar[brighttext] #bookmarks-menu-butt
   #panic-button[cui-areatype="toolbar"][open] {
 %ifdef XP_MACOSX
     -moz-image-region: rect(72px, 1404px, 108px, 1368px);
 %else
     -moz-image-region: rect(36px, 1404px, 72px, 1368px);
 %endif
   }
 
-  #web-apps-button[cui-areatype="toolbar"] {
-    -moz-image-region: rect(0, 1440px, 36px, 1404px);
-  }
-
   #webide-button[cui-areatype="toolbar"] {
     -moz-image-region: rect(0, 1476px, 36px, 1440px);
   }
 }
 %endif
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..59337608dd99609eaa474c2f380ce8c3b717376e
GIT binary patch
literal 768
zc$@(M1ONPqP)<h;3K|Lk000e1NJLTq004df000sQ1^@s6ofT@S0008VNkl<ZcmeI0
z1B_i=6h=F>ZQHhOH>hnRPVG3UZ3ngOpw?g8Zhxy<Np_Q+mv_!+NB7N_tQ_2%l{xuF
z=Ov2FBqS<yqix%^Q4GzY2h@Rl^5_|yg-vh}zJo6&p1J@2Z{nFY?tzJ?V8KEro~2vX
zn0S)p&mAXERPGhBCY5)zE5NWG>VYq(p%*-HJU8)Bx`~I<O+1ut;-PdC52eT1lUS8r
zn&G@pqEb)ZEe)a3p4Tt|%0pVAyzIU9c_>|bbW%a;n0`H!ZgMV4H}O!qiHFkT<w-21
zr(xIw+0@JbgHGsPHrNem)SmY2gVHb?uEU?gb=fNo`?N=uu05ei1t~)}wMUh1axO|Y
z@ld*nhtlKiNi3U#ppbfLI;51*w^tYj$y|G`KqvSFu6&Yru6R7*l1>O0?Xf>sKs>tm
zZlH4tzQIY~o}{~s+A{_I18?M=$qtVzX#_{aV{op(dQ|b{L1z(6g2lc)N%=7IqY%>^
zb9h`y38}ylug80?Nb)3gT<eO%bl;xJzn<%1Op-K~o;2Wzcnr=JWKUvQTvZPS!gM$a
zui&fj3J$|GdFN+t%cwn#A*QMC@VIhXa6~)?=L)hXsVp`_b(s%=x}Lw$$>FS8Z;?@Z
zro%yxL%XJXJic#~Q;z52F*sL%J&9$p93IQO8f=5?5Sr}rtg5UZ!7`a^Pes@cnZT8d
z@=isMCtUvb98!4<&J|RTd~&Bhz&WArhQGsZxGC$>&`w>Y-a$iouA@D#VZL}C$nzrN
z83j3A9`5qW6N5NB+~rNq#a-US!(HCQ!(BdJp3skMS26U1=yC>nd44KQJd|(Zp?nh$
z<(qgY-^4@tarPuurRQVlBFpoz9v;FM_zUjKUTdiDDc!_F=_VdZH}O!qiHFinJd_?U
yPf|4>2^(QE9EZ3j_?{qm_*EZyBoL{^C-4JMq@6f>$x7`20000<MNUMnLSTYpx^T+?
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b87e1ffa3265f63cf6ecc0acadc5343718919fcb
GIT binary patch
literal 1599
zc${rjeKga180YHB?dD~9z07aiG%F(ErrM8EYgfuF%9ZA2b%|t?jBR(6UY3&Gjw5n2
zHKnd3N)q!jYevMnxW@82@0uB7BXO70=?~|A&-e3u&-tG7{XC!NIp61blD)mq+Urc$
zsi~=Hd;Gfpi0WKa!AeV0WuMmhZBkRy)b!ZD*Ee2W(ydWo<pJf(%$}YVm7cx(#i(|`
z`>xU*F6>t^y@7;>rAKhBw9nOXv!1SZ8cxaHP56!%2_LR$ZdqCOSG+~B9k{<_+jTw*
zjI_Of;{1zOhl|&;>HgPZSd__y83Gpc%Xaqh#iYRxqh^uvfixCn`^|A)S6aT}G}Cyd
zyz+HGR)$8j>4HU5!W%FiVy4I2KTE7ftwQc(wA&PPu8NJkPC}eYBibhHvD9zph8V8`
zgUuhSi4i!mPh7LPg)*?IO)rD+v>dS@^!zHwttj%fOm1LShF_7{fN-}^H?cM}kBO|R
zvsSKiEc)&tR^z6F-bM$lzul=WA495K(~AJk7Cf#k2&Pl<c!c-OCFUM_=hWMGOS?$u
zyHqo3u1TJxz?$)h_#>PXDj@=?d)_{zbAh=DAG1ci0(d;EyMxZP8z)B#RdKCAU*fT^
zn`Z%^lcajyZ^{n?4)h@oB}w4@h?JTS^^_)?OIvNsmOJ>gP1StGgLF|PXrI9;d8uZz
zD8ePB3Omn(tpej5Zfs62Ebq!#Kgo|8dCZ?oIFSiN#bH}+h;Y8TuPPn`QHnRzHnS!8
z;JpCA`o3um)iq{`lrluraB7{its~mH-w(Ll|J%o&lP{mA?qFA;mu9BH4b-+o`Ur{8
z-01Y+zUZWjkw}V#>d%QbH|A~%#eW*3ka*N<=fpC*6!61j1VeJQ&t{ETiai9s@PED&
z+?)?|wqR*_wpTvi^ODR%q?Y5AbeK6M(r+&f7IBav9QhI=LY*6Y{29W{=a;5|7ks@A
zAZD}}M;@x=%E5n_8H+$~+R-JAJK<=tA2KDFFGh3_9u-vb!g?(VX<~u?L^XG}Tq{11
zMg4<uuI~xA!~m$dS)Y5o^;PS$a$Z;rq+@uOTv&K_x+i1-2ygLBU`QK&{<wv{KuSoL
zOS|Fo<OZn>43F$QX!SDPD98E0i8F%&eT6+cS{j`r-P{1ay_lob?NyVVsoU|6Cvh<<
zKU|`Wv>52JpaUXY@?xl8jfxn%LX6c}91%Q)HM?&tsS7F74Z<58%Z-20o|$Y<)YU<G
zI&pSh-S_D=FN|+dXnwLiP53Q9-tEfNiCeXEyA5>vtPhDk`d`KopzC7EY@OH$3@n8)
zX51r>9xd)hyO?qSu89yc2AO9MDwM$N)n!^sT%K&&we9yQXg(*leG0nWTj83wH@k2I
z(uVdua{(PmX+~uGP$T1Pjnvt?Ag#qP&dGR|J=}C>YyQY(4TeFx50Y@}8q=w?7llYF
zA6A+;LrBgthpc@#h+R@>7qeWso^8Y~R~oQ)DTD<k0j27<TNU-Rz-d*=mlWI}PGh>@
ztfkkRilWZKcmdHSDEUcnR$-W3YTXF2a~m?XE`+Ldp3MTpJ+(5eIlZ~dWJ`+bg2gnh
z&I|O_{c2p_Gi}>&H==~*<KtrU#p~9xoq4%hoad)6_PcBV*B2AS#~;5K3s1qwtfI8%
z*9PCcvGLE;0zMnOAW*4E46H&&GUgd&6vK*IB)&+8v*jXUMpz*<{#xcWR3*f*7|MxY
z?WBb4SdYpV08wNg#wRGXYzPI~N0G7MhiMk2Y)F6HVcGJwA=y6}$~q3b61y8%HmO?F
zC~6h-#~ScqqTK_T9xmSp)gpVv)ITt`U^o|srMa?%7?(BKds13e4=Zkr_mfnOLt>Xt
zU#Sl&9`qk2nRJDGI?Ojz{vdvDEb)dN)r-_N!XGI~bY`f&<KzrDyu8)#N=C!uOVu)m
zNj_b8A(5(5*Ns|52!6?0_9e{J<{nOj)wUHCgW{_Sq%?8B&0I=mx=k@h<~5|`9yb(A
WD36`hoKOu0H4l{6{zCWQr2haK+C47-
--- a/devtools/client/animationinspector/animation-panel.js
+++ b/devtools/client/animationinspector/animation-panel.js
@@ -3,20 +3,18 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 /* import-globals-from animation-controller.js */
 /* globals document */
 
 "use strict";
 
-const {
-  AnimationsTimeline,
-  RateSelector
-} = require("devtools/client/animationinspector/components");
+const {AnimationsTimeline} = require("devtools/client/animationinspector/components/animation-timeline");
+const {RateSelector} = require("devtools/client/animationinspector/components/rate-selector");
 const {formatStopwatchTime} = require("devtools/client/animationinspector/utils");
 
 var $ = (selector, target = document) => target.querySelector(selector);
 
 /**
  * The main animations panel UI.
  */
 var AnimationsPanel = {
deleted file mode 100644
--- a/devtools/client/animationinspector/components.js
+++ /dev/null
@@ -1,1350 +0,0 @@
-/* -*- 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/. */
-
-"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:
-//    c.init(containerElement);
-// 3. render the component, passing in some sort of state:
-//    This may be called over and over again when the state changes, to update
-//    the component output.
-//    c.render(state);
-// 4. destroy the component:
-//    c.destroy();
-
-const {Cu} = require("chrome");
-Cu.import("resource://devtools/client/shared/widgets/ViewHelpers.jsm");
-const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
-const {
-  createNode,
-  drawGraphElementBackground,
-  findOptimalTimeInterval,
-  TargetNodeHighlighter
-} = require("devtools/client/animationinspector/utils");
-
-const STRINGS_URI = "chrome://devtools/locale/animationinspector.properties";
-const L10N = new ViewHelpers.L10N(STRINGS_URI);
-const MILLIS_TIME_FORMAT_MAX_DURATION = 4000;
-// The minimum spacing between 2 time graduation headers in the timeline (px).
-const TIME_GRADUATION_MIN_SPACING = 40;
-// List of playback rate presets displayed in the timeline toolbar.
-const PLAYBACK_RATES = [.1, .25, .5, 1, 2, 5, 10];
-// When the container window is resized, the timeline background gets refreshed,
-// but only after a timer, and the timer is reset if the window is continuously
-// resized.
-const TIMELINE_BACKGROUND_RESIZE_DEBOUNCE_TIMER = 50;
-
-/**
- * UI component responsible for displaying a preview of the target dom node of
- * a given animation.
- * @param {InspectorPanel} inspector Requires a reference to the inspector-panel
- * to highlight and select the node, as well as refresh it when there are
- * mutations.
- * @param {Object} options Supported properties are:
- * - compact {Boolean} Defaults to false. If true, nodes will be previewed like
- *   tag#id.class instead of <tag id="id" class="class">
- */
-function AnimationTargetNode(inspector, options={}) {
-  this.inspector = inspector;
-  this.options = options;
-
-  this.onPreviewMouseOver = this.onPreviewMouseOver.bind(this);
-  this.onPreviewMouseOut = this.onPreviewMouseOut.bind(this);
-  this.onSelectNodeClick = this.onSelectNodeClick.bind(this);
-  this.onMarkupMutations = this.onMarkupMutations.bind(this);
-  this.onHighlightNodeClick = this.onHighlightNodeClick.bind(this);
-  this.onTargetHighlighterLocked = this.onTargetHighlighterLocked.bind(this);
-
-  EventEmitter.decorate(this);
-}
-
-exports.AnimationTargetNode = AnimationTargetNode;
-
-AnimationTargetNode.prototype = {
-  init: function(containerEl) {
-    let document = containerEl.ownerDocument;
-
-    // Init the markup for displaying the target node.
-    this.el = createNode({
-      parent: containerEl,
-      attributes: {
-        "class": "animation-target"
-      }
-    });
-
-    // Icon to select the node in the inspector.
-    this.highlightNodeEl = createNode({
-      parent: this.el,
-      nodeType: "span",
-      attributes: {
-        "class": "node-highlighter",
-        "title": L10N.getStr("node.highlightNodeLabel")
-      }
-    });
-
-    // Wrapper used for mouseover/out event handling.
-    this.previewEl = createNode({
-      parent: this.el,
-      nodeType: "span",
-      attributes: {
-        "title": L10N.getStr("node.selectNodeLabel")
-      }
-    });
-
-    if (!this.options.compact) {
-      this.previewEl.appendChild(document.createTextNode("<"));
-    }
-
-    // Tag name.
-    this.tagNameEl = createNode({
-      parent: this.previewEl,
-      nodeType: "span",
-      attributes: {
-        "class": "tag-name theme-fg-color3"
-      }
-    });
-
-    // Id attribute container.
-    this.idEl = createNode({
-      parent: this.previewEl,
-      nodeType: "span"
-    });
-
-    if (!this.options.compact) {
-      createNode({
-        parent: this.idEl,
-        nodeType: "span",
-        attributes: {
-          "class": "attribute-name theme-fg-color2"
-        },
-        textContent: "id"
-      });
-      this.idEl.appendChild(document.createTextNode("=\""));
-    } else {
-      createNode({
-        parent: this.idEl,
-        nodeType: "span",
-        attributes: {
-          "class": "theme-fg-color2"
-        },
-        textContent: "#"
-      });
-    }
-
-    createNode({
-      parent: this.idEl,
-      nodeType: "span",
-      attributes: {
-        "class": "attribute-value theme-fg-color6"
-      }
-    });
-
-    if (!this.options.compact) {
-      this.idEl.appendChild(document.createTextNode("\""));
-    }
-
-    // Class attribute container.
-    this.classEl = createNode({
-      parent: this.previewEl,
-      nodeType: "span"
-    });
-
-    if (!this.options.compact) {
-      createNode({
-        parent: this.classEl,
-        nodeType: "span",
-        attributes: {
-          "class": "attribute-name theme-fg-color2"
-        },
-        textContent: "class"
-      });
-      this.classEl.appendChild(document.createTextNode("=\""));
-    } else {
-      createNode({
-        parent: this.classEl,
-        nodeType: "span",
-        attributes: {
-          "class": "theme-fg-color6"
-        },
-        textContent: "."
-      });
-    }
-
-    createNode({
-      parent: this.classEl,
-      nodeType: "span",
-      attributes: {
-        "class": "attribute-value theme-fg-color6"
-      }
-    });
-
-    if (!this.options.compact) {
-      this.classEl.appendChild(document.createTextNode("\""));
-      this.previewEl.appendChild(document.createTextNode(">"));
-    }
-
-    this.startListeners();
-  },
-
-  startListeners: function() {
-    // Init events for highlighting and selecting the node.
-    this.previewEl.addEventListener("mouseover", this.onPreviewMouseOver);
-    this.previewEl.addEventListener("mouseout", this.onPreviewMouseOut);
-    this.previewEl.addEventListener("click", this.onSelectNodeClick);
-    this.highlightNodeEl.addEventListener("click", this.onHighlightNodeClick);
-
-    // Start to listen for markupmutation events.
-    this.inspector.on("markupmutation", this.onMarkupMutations);
-
-    // Listen to the target node highlighter.
-    TargetNodeHighlighter.on("highlighted", this.onTargetHighlighterLocked);
-  },
-
-  stopListeners: function() {
-    TargetNodeHighlighter.off("highlighted", this.onTargetHighlighterLocked);
-    this.inspector.off("markupmutation", this.onMarkupMutations);
-    this.previewEl.removeEventListener("mouseover", this.onPreviewMouseOver);
-    this.previewEl.removeEventListener("mouseout", this.onPreviewMouseOut);
-    this.previewEl.removeEventListener("click", this.onSelectNodeClick);
-    this.highlightNodeEl.removeEventListener("click", this.onHighlightNodeClick);
-  },
-
-  destroy: function() {
-    TargetNodeHighlighter.unhighlight().catch(e => console.error(e));
-
-    this.stopListeners();
-
-    this.el.remove();
-    this.el = this.tagNameEl = this.idEl = this.classEl = null;
-    this.highlightNodeEl = this.previewEl = null;
-    this.nodeFront = this.inspector = this.playerFront = null;
-  },
-
-  get highlighterUtils() {
-    if (this.inspector && this.inspector.toolbox) {
-      return this.inspector.toolbox.highlighterUtils;
-    }
-    return null;
-  },
-
-  onPreviewMouseOver: function() {
-    if (!this.nodeFront || !this.highlighterUtils) {
-      return;
-    }
-    this.highlighterUtils.highlightNodeFront(this.nodeFront)
-                         .catch(e => console.error(e));
-  },
-
-  onPreviewMouseOut: function() {
-    if (!this.nodeFront || !this.highlighterUtils) {
-      return;
-    }
-    this.highlighterUtils.unhighlight()
-                         .catch(e => console.error(e));
-  },
-
-  onSelectNodeClick: function() {
-    if (!this.nodeFront) {
-      return;
-    }
-    this.inspector.selection.setNodeFront(this.nodeFront, "animationinspector");
-  },
-
-  onHighlightNodeClick: function(e) {
-    e.stopPropagation();
-
-    let classList = this.highlightNodeEl.classList;
-
-    let isHighlighted = classList.contains("selected");
-    if (isHighlighted) {
-      classList.remove("selected");
-      TargetNodeHighlighter.unhighlight().then(() => {
-        this.emit("target-highlighter-unlocked");
-      }, e => console.error(e));
-    } else {
-      classList.add("selected");
-      TargetNodeHighlighter.highlight(this).then(() => {
-        this.emit("target-highlighter-locked");
-      }, e => console.error(e));
-    }
-  },
-
-  onTargetHighlighterLocked: function(e, animationTargetNode) {
-    if (animationTargetNode !== this) {
-      this.highlightNodeEl.classList.remove("selected");
-    }
-  },
-
-  onMarkupMutations: function(e, mutations) {
-    if (!this.nodeFront || !this.playerFront) {
-      return;
-    }
-
-    for (let {target} of mutations) {
-      if (target === this.nodeFront) {
-        // Re-render with the same nodeFront to update the output.
-        this.render(this.playerFront);
-        break;
-      }
-    }
-  },
-
-  render: Task.async(function*(playerFront) {
-    this.playerFront = playerFront;
-    this.nodeFront = undefined;
-
-    try {
-      this.nodeFront = yield this.inspector.walker.getNodeFromActor(
-                             playerFront.actorID, ["node"]);
-    } catch (e) {
-      if (!this.el) {
-        // The panel was destroyed in the meantime. Just log a warning.
-        console.warn("Cound't retrieve the animation target node, widget " +
-                     "destroyed");
-      } else {
-        // This was an unexpected error, log it.
-        console.error(e);
-      }
-      return;
-    }
-
-    if (!this.nodeFront || !this.el) {
-      return;
-    }
-
-    let {tagName, attributes} = this.nodeFront;
-
-    this.tagNameEl.textContent = tagName.toLowerCase();
-
-    let idIndex = attributes.findIndex(({name}) => name === "id");
-    if (idIndex > -1 && attributes[idIndex].value) {
-      this.idEl.querySelector(".attribute-value").textContent =
-        attributes[idIndex].value;
-      this.idEl.style.display = "inline";
-    } else {
-      this.idEl.style.display = "none";
-    }
-
-    let classIndex = attributes.findIndex(({name}) => name === "class");
-    if (classIndex > -1 && attributes[classIndex].value) {
-      let value = attributes[classIndex].value;
-      if (this.options.compact) {
-        value = value.split(" ").join(".");
-      }
-
-      this.classEl.querySelector(".attribute-value").textContent = value;
-      this.classEl.style.display = "inline";
-    } else {
-      this.classEl.style.display = "none";
-    }
-
-    this.emit("target-retrieved");
-  })
-};
-
-/**
- * UI component responsible for displaying a playback rate selector UI.
- * The rendering logic is such that a predefined list of rates is generated.
- * If *all* animations passed to render share the same rate, then that rate is
- * selected in the <select> element, otherwise, the empty value is selected.
- * If the rate that all animations share isn't part of the list of predefined
- * rates, than that rate is added to the list.
- */
-function RateSelector() {
-  this.onRateChanged = this.onRateChanged.bind(this);
-  EventEmitter.decorate(this);
-}
-
-exports.RateSelector = RateSelector;
-
-RateSelector.prototype = {
-  init: function(containerEl) {
-    this.selectEl = createNode({
-      parent: containerEl,
-      nodeType: "select",
-      attributes: {"class": "devtools-button"}
-    });
-
-    this.selectEl.addEventListener("change", this.onRateChanged);
-  },
-
-  destroy: function() {
-    this.selectEl.removeEventListener("change", this.onRateChanged);
-    this.selectEl.remove();
-    this.selectEl = null;
-  },
-
-  getAnimationsRates: function(animations) {
-    return sortedUnique(animations.map(a => a.state.playbackRate));
-  },
-
-  getAllRates: function(animations) {
-    let animationsRates = this.getAnimationsRates(animations);
-    if (animationsRates.length > 1) {
-      return PLAYBACK_RATES;
-    }
-
-    return sortedUnique(PLAYBACK_RATES.concat(animationsRates));
-  },
-
-  render: function(animations) {
-    let allRates = this.getAnimationsRates(animations);
-    let hasOneRate = allRates.length === 1;
-
-    this.selectEl.innerHTML = "";
-
-    if (!hasOneRate) {
-      // When the animations displayed have mixed playback rates, we can't
-      // select any of the predefined ones, instead, insert an empty rate.
-      createNode({
-        parent: this.selectEl,
-        nodeType: "option",
-        attributes: {value: "", selector: "true"},
-        textContent: "-"
-      });
-    }
-    for (let rate of this.getAllRates(animations)) {
-      let option = createNode({
-        parent: this.selectEl,
-        nodeType: "option",
-        attributes: {value: rate},
-        textContent: L10N.getFormatStr("player.playbackRateLabel", rate)
-      });
-
-      // If there's only one rate and this is the option for it, select it.
-      if (hasOneRate && rate === allRates[0]) {
-        option.setAttribute("selected", "true");
-      }
-    }
-  },
-
-  onRateChanged: function() {
-    let rate = parseFloat(this.selectEl.value);
-    if (!isNaN(rate)) {
-      this.emit("rate-changed", rate);
-    }
-  }
-};
-
-/**
- * The TimeScale helper object is used to know which size should something be
- * displayed with in the animation panel, depending on the animations that are
- * currently displayed.
- * If there are 5 animations displayed, and the first one starts at 10000ms and
- * the last one ends at 20000ms, then this helper can be used to convert any
- * time in this range to a distance in pixels.
- *
- * For the helper to know how to convert, it needs to know all the animations.
- * Whenever a new animation is added to the panel, addAnimation(state) should be
- * called. reset() can be called to start over.
- */
-var TimeScale = {
-  minStartTime: Infinity,
-  maxEndTime: 0,
-
-  /**
-   * Add a new animation to time scale.
-   * @param {Object} state A PlayerFront.state object.
-   */
-  addAnimation: function(state) {
-    let {previousStartTime, delay, duration,
-         iterationCount, playbackRate} = state;
-
-    // Negative-delayed animations have their startTimes set such that we would
-    // be displaying the delay outside the time window if we didn't take it into
-    // account here.
-    let relevantDelay = delay < 0 ? delay / playbackRate : 0;
-    previousStartTime = previousStartTime || 0;
-
-    this.minStartTime = Math.min(this.minStartTime,
-                                 previousStartTime + relevantDelay);
-    let length = (delay / playbackRate) +
-                 ((duration / playbackRate) *
-                  (!iterationCount ? 1 : iterationCount));
-    let endTime = previousStartTime + length;
-    this.maxEndTime = Math.max(this.maxEndTime, endTime);
-  },
-
-  /**
-   * Reset the current time scale.
-   */
-  reset: function() {
-    this.minStartTime = Infinity;
-    this.maxEndTime = 0;
-  },
-
-  /**
-   * Convert a startTime to a distance in %, in the current time scale.
-   * @param {Number} time
-   * @return {Number}
-   */
-  startTimeToDistance: function(time) {
-    time -= this.minStartTime;
-    return this.durationToDistance(time);
-  },
-
-  /**
-   * Convert a duration to a distance in %, in the current time scale.
-   * @param {Number} time
-   * @return {Number}
-   */
-  durationToDistance: function(duration) {
-    return duration * 100 / this.getDuration();
-  },
-
-  /**
-   * Convert a distance in % to a time, in the current time scale.
-   * @param {Number} distance
-   * @return {Number}
-   */
-  distanceToTime: function(distance) {
-    return this.minStartTime + (this.getDuration() * distance / 100);
-  },
-
-  /**
-   * Convert a distance in % to a time, in the current time scale.
-   * The time will be relative to the current minimum start time.
-   * @param {Number} distance
-   * @return {Number}
-   */
-  distanceToRelativeTime: function(distance) {
-    let time = this.distanceToTime(distance);
-    return time - this.minStartTime;
-  },
-
-  /**
-   * Depending on the time scale, format the given time as milliseconds or
-   * seconds.
-   * @param {Number} time
-   * @return {String} The formatted time string.
-   */
-  formatTime: function(time) {
-    // Format in milliseconds if the total duration is short enough.
-    if (this.getDuration() <= MILLIS_TIME_FORMAT_MAX_DURATION) {
-      return L10N.getFormatStr("timeline.timeGraduationLabel", time.toFixed(0));
-    }
-
-    // Otherwise format in seconds.
-    return L10N.getFormatStr("player.timeLabel", (time / 1000).toFixed(1));
-  },
-
-  getDuration: function() {
-    return this.maxEndTime - this.minStartTime;
-  },
-
-  /**
-   * Given an animation, get the various dimensions (in %) useful to draw the
-   * animation in the timeline.
-   */
-  getAnimationDimensions: function({state}) {
-    let start = state.previousStartTime || 0;
-    let duration = state.duration;
-    let rate = state.playbackRate;
-    let count = state.iterationCount;
-    let delay = state.delay || 0;
-
-    // The start position.
-    let x = this.startTimeToDistance(start + (delay / rate));
-    // The width for a single iteration.
-    let w = this.durationToDistance(duration / rate);
-    // The width for all iterations.
-    let iterationW = w * (count || 1);
-    // The start position of the delay.
-    let delayX = this.durationToDistance((delay < 0 ? 0 : delay) / rate);
-    // The width of the delay.
-    let delayW = this.durationToDistance(Math.abs(delay) / rate);
-    // The width of the delay if it is positive, 0 otherwise.
-    let negativeDelayW = delay < 0 ? delayW : 0;
-
-    return {x, w, iterationW, delayX, delayW, negativeDelayW};
-  }
-};
-
-exports.TimeScale = TimeScale;
-
-/**
- * UI component responsible for displaying a timeline for animations.
- * The timeline is essentially a graph with time along the x axis and animations
- * along the y axis.
- * The time is represented with a graduation header at the top and a current
- * time play head.
- * Animations are organized by lines, with a left margin containing the preview
- * of the target DOM element the animation applies to.
- * The current time play head can be moved by clicking/dragging in the header.
- * when this happens, the component emits "current-data-changed" events with the
- * new time and state of the timeline.
- *
- * @param {InspectorPanel} inspector.
- */
-function AnimationsTimeline(inspector) {
-  this.animations = [];
-  this.targetNodes = [];
-  this.timeBlocks = [];
-  this.details = [];
-  this.inspector = inspector;
-
-  this.onAnimationStateChanged = this.onAnimationStateChanged.bind(this);
-  this.onScrubberMouseDown = this.onScrubberMouseDown.bind(this);
-  this.onScrubberMouseUp = this.onScrubberMouseUp.bind(this);
-  this.onScrubberMouseOut = this.onScrubberMouseOut.bind(this);
-  this.onScrubberMouseMove = this.onScrubberMouseMove.bind(this);
-  this.onAnimationSelected = this.onAnimationSelected.bind(this);
-  this.onWindowResize = this.onWindowResize.bind(this);
-  this.onFrameSelected = this.onFrameSelected.bind(this);
-
-  EventEmitter.decorate(this);
-}
-
-exports.AnimationsTimeline = AnimationsTimeline;
-
-AnimationsTimeline.prototype = {
-  init: function(containerEl) {
-    this.win = containerEl.ownerDocument.defaultView;
-
-    this.rootWrapperEl = createNode({
-      parent: containerEl,
-      attributes: {
-        "class": "animation-timeline"
-      }
-    });
-
-    let scrubberContainer = createNode({
-      parent: this.rootWrapperEl,
-      attributes: {"class": "scrubber-wrapper track-container"}
-    });
-
-    this.scrubberEl = createNode({
-      parent: scrubberContainer,
-      attributes: {
-        "class": "scrubber"
-      }
-    });
-
-    this.scrubberHandleEl = createNode({
-      parent: this.scrubberEl,
-      attributes: {
-        "class": "scrubber-handle"
-      }
-    });
-    this.scrubberHandleEl.addEventListener("mousedown", this.onScrubberMouseDown);
-
-    this.timeHeaderEl = createNode({
-      parent: this.rootWrapperEl,
-      attributes: {
-        "class": "time-header track-container"
-      }
-    });
-    this.timeHeaderEl.addEventListener("mousedown", this.onScrubberMouseDown);
-
-    this.animationsEl = createNode({
-      parent: this.rootWrapperEl,
-      nodeType: "ul",
-      attributes: {
-        "class": "animations"
-      }
-    });
-
-    this.win.addEventListener("resize", this.onWindowResize);
-  },
-
-  destroy: function() {
-    this.stopAnimatingScrubber();
-    this.unrender();
-
-    this.win.removeEventListener("resize", this.onWindowResize);
-    this.timeHeaderEl.removeEventListener("mousedown",
-      this.onScrubberMouseDown);
-    this.scrubberHandleEl.removeEventListener("mousedown",
-      this.onScrubberMouseDown);
-
-    this.rootWrapperEl.remove();
-    this.animations = [];
-
-    this.rootWrapperEl = null;
-    this.timeHeaderEl = null;
-    this.animationsEl = null;
-    this.scrubberEl = null;
-    this.scrubberHandleEl = null;
-    this.win = null;
-    this.inspector = null;
-  },
-
-  /**
-   * Destroy sub-components that have been created and stored on this instance.
-   * @param {String} name An array of components will be expected in this[name]
-   * @param {Array} handlers An option list of event handlers information that
-   * should be used to remove these handlers.
-   */
-  destroySubComponents: function(name, handlers = []) {
-    for (let component of this[name]) {
-      for (let {event, fn} of handlers) {
-        component.off(event, fn);
-      }
-      component.destroy();
-    }
-    this[name] = [];
-  },
-
-  unrender: function() {
-    for (let animation of this.animations) {
-      animation.off("changed", this.onAnimationStateChanged);
-    }
-    TimeScale.reset();
-    this.destroySubComponents("targetNodes");
-    this.destroySubComponents("timeBlocks");
-    this.destroySubComponents("details", [{
-      event: "frame-selected",
-      fn: this.onFrameSelected
-    }]);
-    this.animationsEl.innerHTML = "";
-  },
-
-  onWindowResize: function() {
-    if (this.windowResizeTimer) {
-      this.win.clearTimeout(this.windowResizeTimer);
-    }
-
-    this.windowResizeTimer = this.win.setTimeout(() => {
-      this.drawHeaderAndBackground();
-    }, TIMELINE_BACKGROUND_RESIZE_DEBOUNCE_TIMER);
-  },
-
-  onAnimationSelected: function(e, animation) {
-    let index = this.animations.indexOf(animation);
-    if (index === -1) {
-      return;
-    }
-
-    let el = this.rootWrapperEl;
-    let animationEl = el.querySelectorAll(".animation")[index];
-    let propsEl = el.querySelectorAll(".animated-properties")[index];
-
-    // Toggle the selected state on this animation.
-    animationEl.classList.toggle("selected");
-    propsEl.classList.toggle("selected");
-
-    // Render the details component for this animation if it was shown.
-    if (animationEl.classList.contains("selected")) {
-      this.details[index].render(animation);
-      this.emit("animation-selected", animation);
-    } else {
-      this.emit("animation-unselected", animation);
-    }
-  },
-
-  /**
-   * When a frame gets selected, move the scrubber to the corresponding position
-   */
-  onFrameSelected: function(e, {x}) {
-    this.moveScrubberTo(x, true);
-  },
-
-  onScrubberMouseDown: function(e) {
-    this.moveScrubberTo(e.pageX);
-    this.win.addEventListener("mouseup", this.onScrubberMouseUp);
-    this.win.addEventListener("mouseout", this.onScrubberMouseOut);
-    this.win.addEventListener("mousemove", this.onScrubberMouseMove);
-
-    // Prevent text selection while dragging.
-    e.preventDefault();
-  },
-
-  onScrubberMouseUp: function() {
-    this.cancelTimeHeaderDragging();
-  },
-
-  onScrubberMouseOut: function(e) {
-    // Check that mouseout happened on the window itself, and if yes, cancel
-    // the dragging.
-    if (!this.win.document.contains(e.relatedTarget)) {
-      this.cancelTimeHeaderDragging();
-    }
-  },
-
-  cancelTimeHeaderDragging: function() {
-    this.win.removeEventListener("mouseup", this.onScrubberMouseUp);
-    this.win.removeEventListener("mouseout", this.onScrubberMouseOut);
-    this.win.removeEventListener("mousemove", this.onScrubberMouseMove);
-  },
-
-  onScrubberMouseMove: function(e) {
-    this.moveScrubberTo(e.pageX);
-  },
-
-  moveScrubberTo: function(pageX, noOffset) {
-    this.stopAnimatingScrubber();
-
-    // The offset needs to be in % and relative to the timeline's area (so we
-    // subtract the scrubber's left offset, which is equal to the sidebar's
-    // width).
-    let offset = pageX;
-    if (!noOffset) {
-      offset -= this.timeHeaderEl.offsetLeft;
-    }
-    offset = offset * 100 / this.timeHeaderEl.offsetWidth;
-    if (offset < 0) {
-      offset = 0;
-    }
-
-    this.scrubberEl.style.left = offset + "%";
-
-    let time = TimeScale.distanceToRelativeTime(offset);
-
-    this.emit("timeline-data-changed", {
-      isPaused: true,
-      isMoving: false,
-      isUserDrag: true,
-      time: time
-    });
-  },
-
-  render: function(animations, documentCurrentTime) {
-    this.unrender();
-
-    this.animations = animations;
-    if (!this.animations.length) {
-      return;
-    }
-
-    // Loop first to set the time scale for all current animations.
-    for (let {state} of animations) {
-      TimeScale.addAnimation(state);
-    }
-
-    this.drawHeaderAndBackground();
-
-    for (let animation of this.animations) {
-      animation.on("changed", this.onAnimationStateChanged);
-
-      // Each line contains the target animated node and the animation time
-      // block.
-      let animationEl = createNode({
-        parent: this.animationsEl,
-        nodeType: "li",
-        attributes: {
-          "class": "animation" + (animation.state.isRunningOnCompositor
-                                  ? " fast-track"
-                                  : "")
-        }
-      });
-
-      // Right below the line is a hidden-by-default line for displaying the
-      // inline keyframes.
-      let detailsEl = createNode({
-        parent: this.animationsEl,
-        nodeType: "li",
-        attributes: {
-          "class": "animated-properties"
-        }
-      });
-
-      let details = new AnimationDetails();
-      details.init(detailsEl);
-      details.on("frame-selected", this.onFrameSelected);
-      this.details.push(details);
-
-      // Left sidebar for the animated node.
-      let animatedNodeEl = createNode({
-        parent: animationEl,
-        attributes: {
-          "class": "target"
-        }
-      });
-
-      // Draw the animated node target.
-      let targetNode = new AnimationTargetNode(this.inspector, {compact: true});
-      targetNode.init(animatedNodeEl);
-      targetNode.render(animation);
-      this.targetNodes.push(targetNode);
-
-      // Right-hand part contains the timeline itself (called time-block here).
-      let timeBlockEl = createNode({
-        parent: animationEl,
-        attributes: {
-          "class": "time-block track-container"
-        }
-      });
-
-      // Draw the animation time block.
-      let timeBlock = new AnimationTimeBlock();
-      timeBlock.init(timeBlockEl);
-      timeBlock.render(animation);
-      this.timeBlocks.push(timeBlock);
-
-      timeBlock.on("selected", this.onAnimationSelected);
-    }
-
-    // Use the document's current time to position the scrubber (if the server
-    // doesn't provide it, hide the scrubber entirely).
-    // Note that because the currentTime was sent via the protocol, some time
-    // may have gone by since then, and so the scrubber might be a bit late.
-    if (!documentCurrentTime) {
-      this.scrubberEl.style.display = "none";
-    } else {
-      this.scrubberEl.style.display = "block";
-      this.startAnimatingScrubber(this.wasRewound()
-                                  ? TimeScale.minStartTime
-                                  : documentCurrentTime);
-    }
-  },
-
-  isAtLeastOneAnimationPlaying: function() {
-    return this.animations.some(({state}) => state.playState === "running");
-  },
-
-  wasRewound: function() {
-    return !this.isAtLeastOneAnimationPlaying() &&
-           this.animations.every(({state}) => state.currentTime === 0);
-  },
-
-  hasInfiniteAnimations: function() {
-    return this.animations.some(({state}) => !state.iterationCount);
-  },
-
-  startAnimatingScrubber: function(time) {
-    let x = TimeScale.startTimeToDistance(time);
-    this.scrubberEl.style.left = x + "%";
-
-    // Only stop the scrubber if it's out of bounds or all animations have been
-    // paused, but not if at least an animation is infinite.
-    let isOutOfBounds = time < TimeScale.minStartTime ||
-                        time > TimeScale.maxEndTime;
-    let isAllPaused = !this.isAtLeastOneAnimationPlaying();
-    let hasInfinite = this.hasInfiniteAnimations();
-
-    if (isAllPaused || (isOutOfBounds && !hasInfinite)) {
-      this.stopAnimatingScrubber();
-      this.emit("timeline-data-changed", {
-        isPaused: !this.isAtLeastOneAnimationPlaying(),
-        isMoving: false,
-        isUserDrag: false,
-        time: TimeScale.distanceToRelativeTime(x)
-      });
-      return;
-    }
-
-    this.emit("timeline-data-changed", {
-      isPaused: false,
-      isMoving: true,
-      isUserDrag: false,
-      time: TimeScale.distanceToRelativeTime(x)
-    });
-
-    let now = this.win.performance.now();
-    this.rafID = this.win.requestAnimationFrame(() => {
-      if (!this.rafID) {
-        // In case the scrubber was stopped in the meantime.
-        return;
-      }
-      this.startAnimatingScrubber(time + this.win.performance.now() - now);
-    });
-  },
-
-  stopAnimatingScrubber: function() {
-    if (this.rafID) {
-      this.win.cancelAnimationFrame(this.rafID);
-      this.rafID = null;
-    }
-  },
-
-  onAnimationStateChanged: function() {
-    // For now, simply re-render the component. The animation front's state has
-    // already been updated.
-    this.render(this.animations);
-  },
-
-  drawHeaderAndBackground: function() {
-    let width = this.timeHeaderEl.offsetWidth;
-    let scale = width / (TimeScale.maxEndTime - TimeScale.minStartTime);
-    drawGraphElementBackground(this.win.document, "time-graduations",
-                               width, scale);
-
-    // And the time graduation header.
-    this.timeHeaderEl.innerHTML = "";
-    let interval = findOptimalTimeInterval(scale, TIME_GRADUATION_MIN_SPACING);
-    for (let i = 0; i < width; i += interval) {
-      let pos = 100 * i / width;
-      createNode({
-        parent: this.timeHeaderEl,
-        nodeType: "span",
-        attributes: {
-          "class": "time-tick",
-          "style": `left:${pos}%`
-        },
-        textContent: TimeScale.formatTime(TimeScale.distanceToRelativeTime(pos))
-      });
-    }
-  }
-};
-
-/**
- * UI component responsible for displaying a single animation timeline, which
- * basically looks like a rectangle that shows the delay and iterations.
- */
-function AnimationTimeBlock() {
-  EventEmitter.decorate(this);
-  this.onClick = this.onClick.bind(this);
-}
-
-exports.AnimationTimeBlock = AnimationTimeBlock;
-
-AnimationTimeBlock.prototype = {
-  init: function(containerEl) {
-    this.containerEl = containerEl;
-    this.containerEl.addEventListener("click", this.onClick);
-  },
-
-  destroy: function() {
-    this.containerEl.removeEventListener("click", this.onClick);
-    this.unrender();
-    this.containerEl = null;
-    this.animation = null;
-  },
-
-  unrender: function() {
-    while (this.containerEl.firstChild) {
-      this.containerEl.firstChild.remove();
-    }
-  },
-
-  render: function(animation) {
-    this.unrender();
-
-    this.animation = animation;
-    let {state} = this.animation;
-
-    // Create a container element to hold the delay and iterations.
-    // It is positioned according to its delay (divided by the playbackrate),
-    // and its width is according to its duration (divided by the playbackrate).
-    let {x, iterationW, delayX, delayW, negativeDelayW} =
-      TimeScale.getAnimationDimensions(animation);
-
-    let iterations = createNode({
-      parent: this.containerEl,
-      attributes: {
-        "class": state.type + " iterations" +
-                 (state.iterationCount ? "" : " infinite"),
-        // Individual iterations are represented by setting the size of the
-        // repeating linear-gradient.
-        "style": `left:${x}%;
-                  width:${iterationW}%;
-                  background-size:${100 / (state.iterationCount || 1)}% 100%;`
-      }
-    });
-
-    // The animation name is displayed over the iterations.
-    // Note that in case of negative delay, we push the name towards the right
-    // so the delay can be shown.
-    createNode({
-      parent: iterations,
-      attributes: {
-        "class": "name",
-        "title": this.getTooltipText(state),
-        // Make space for the negative delay with a margin-left.
-        "style": `margin-left:${negativeDelayW}%`
-      },
-      textContent: state.name
-    });
-
-    // Delay.
-    if (state.delay) {
-      // Negative delays need to start at 0.
-      createNode({
-        parent: iterations,
-        attributes: {
-          "class": "delay" + (state.delay < 0 ? " negative" : ""),
-          "style": `left:-${delayX}%;
-                    width:${delayW}%;`
-        }
-      });
-    }
-  },
-
-  getTooltipText: function(state) {
-    let getTime = time => L10N.getFormatStr("player.timeLabel",
-                            L10N.numberWithDecimals(time / 1000, 2));
-
-    let text = "";
-
-    // Adding the name.
-    text += getFormattedAnimationTitle({state});
-    text += "\n";
-
-    // Adding the delay.
-    text += L10N.getStr("player.animationDelayLabel") + " ";
-    text += getTime(state.delay);
-    text += "\n";
-
-    // Adding the duration.
-    text += L10N.getStr("player.animationDurationLabel") + " ";
-    text += getTime(state.duration);
-    text += "\n";
-
-    // Adding the iteration count (the infinite symbol, or an integer).
-    if (state.iterationCount !== 1) {
-      text += L10N.getStr("player.animationIterationCountLabel") + " ";
-      text += state.iterationCount ||
-              L10N.getStr("player.infiniteIterationCountText");
-      text += "\n";
-    }
-
-    // Adding the playback rate if it's different than 1.
-    if (state.playbackRate !== 1) {
-      text += L10N.getStr("player.animationRateLabel") + " ";
-      text += state.playbackRate;
-      text += "\n";
-    }
-
-    // Adding a note that the animation is running on the compositor thread if
-    // needed.
-    if (state.isRunningOnCompositor) {
-      text += L10N.getStr("player.runningOnCompositorTooltip");
-    }
-
-    return text;
-  },
-
-  onClick: function(e) {
-    e.stopPropagation();
-    this.emit("selected", this.animation);
-  }
-};
-
-/**
- * UI component responsible for displaying detailed information for a given
- * animation.
- * This includes information about timing, easing, keyframes, animated
- * properties.
- */
-function AnimationDetails() {
-  EventEmitter.decorate(this);
-
-  this.onFrameSelected = this.onFrameSelected.bind(this);
-
-  this.keyframeComponents = [];
-}
-
-exports.AnimationDetails = AnimationDetails;
-
-AnimationDetails.prototype = {
-  // These are part of frame objects but are not animated properties. This
-  // array is used to skip them.
-  NON_PROPERTIES: ["easing", "composite", "computedOffset", "offset"],
-
-  init: function(containerEl) {
-    this.containerEl = containerEl;
-  },
-
-  destroy: function() {
-    this.unrender();
-    this.containerEl = null;
-  },
-
-  unrender: function() {
-    for (let component of this.keyframeComponents) {
-      component.off("frame-selected", this.onFrameSelected);
-      component.destroy();
-    }
-    this.keyframeComponents = [];
-
-    while (this.containerEl.firstChild) {
-      this.containerEl.firstChild.remove();
-    }
-  },
-
-  /**
-   * Convert a list of frames into a list of tracks, one per animated property,
-   * each with a list of frames.
-   */
-  getTracksFromFrames: function(frames) {
-    let tracks = {};
-
-    for (let frame of frames) {
-      for (let name in frame) {
-        if (this.NON_PROPERTIES.indexOf(name) != -1) {
-          continue;
-        }
-
-        if (!tracks[name]) {
-          tracks[name] = [];
-        }
-
-        tracks[name].push({
-          value: frame[name],
-          offset: frame.computedOffset
-        });
-      }
-    }
-
-    return tracks;
-  },
-
-  render: Task.async(function*(animation) {
-    this.unrender();
-
-    if (!animation) {
-      return;
-    }
-    this.animation = animation;
-
-    let frames = yield animation.getFrames();
-
-    // We might have been destroyed in the meantime, or the component might
-    // have been re-rendered.
-    if (!this.containerEl || this.animation !== animation) {
-      return;
-    }
-    // Useful for tests to know when the keyframes have been retrieved.
-    this.emit("keyframes-retrieved");
-
-    // Build an element for each animated property track.
-    this.tracks = this.getTracksFromFrames(frames);
-    for (let propertyName in this.tracks) {
-      let line = createNode({
-        parent: this.containerEl,
-        attributes: {"class": "property"}
-      });
-
-      createNode({
-        // text-overflow doesn't work in flex items, so we need a second level
-        // of container to actually have an ellipsis on the name.
-        // See bug 972664.
-        parent: createNode({
-          parent: line,
-          attributes: {"class": "name"},
-        }),
-        textContent: getCssPropertyName(propertyName)
-      });
-
-      // Add the keyframes diagram for this property.
-      let framesWrapperEl = createNode({
-        parent: line,
-        attributes: {"class": "track-container"}
-      });
-
-      let framesEl = createNode({
-        parent: framesWrapperEl,
-        attributes: {"class": "frames"}
-      });
-
-      // Scale the list of keyframes according to the current time scale.
-      let {x, w} = TimeScale.getAnimationDimensions(animation);
-      framesEl.style.left = `${x}%`;
-      framesEl.style.width = `${w}%`;
-
-      let keyframesComponent = new Keyframes();
-      keyframesComponent.init(framesEl);
-      keyframesComponent.render({
-        keyframes: this.tracks[propertyName],
-        propertyName: propertyName,
-        animation: animation
-      });
-      keyframesComponent.on("frame-selected", this.onFrameSelected);
-
-      this.keyframeComponents.push(keyframesComponent);
-    }
-  }),
-
-  onFrameSelected: function(e, args) {
-    // Relay the event up, it's needed in parents too.
-    this.emit(e, args);
-  }
-};
-
-/**
- * UI component responsible for displaying a list of keyframes.
- */
-function Keyframes() {
-  EventEmitter.decorate(this);
-  this.onClick = this.onClick.bind(this);
-}
-
-exports.Keyframes = Keyframes;
-
-Keyframes.prototype = {
-  init: function(containerEl) {
-    this.containerEl = containerEl;
-
-    this.keyframesEl = createNode({
-      parent: this.containerEl,
-      attributes: {"class": "keyframes"}
-    });
-
-    this.containerEl.addEventListener("click", this.onClick);
-  },
-
-  destroy: function() {
-    this.containerEl.removeEventListener("click", this.onClick);
-    this.keyframesEl.remove();
-    this.containerEl = this.keyframesEl = this.animation = null;
-  },
-
-  render: function({keyframes, propertyName, animation}) {
-    this.keyframes = keyframes;
-    this.propertyName = propertyName;
-    this.animation = animation;
-
-    this.keyframesEl.classList.add(animation.state.type);
-    for (let frame of this.keyframes) {
-      createNode({
-        parent: this.keyframesEl,
-        attributes: {
-          "class": "frame",
-          "style": `left:${frame.offset * 100}%;`,
-          "data-offset": frame.offset,
-          "data-property": propertyName,
-          "title": frame.value
-        }
-      });
-    }
-  },
-
-  onClick: function(e) {
-    // If the click happened on a frame, tell our parent about it.
-    if (!e.target.classList.contains("frame")) {
-      return;
-    }
-
-    e.stopPropagation();
-    this.emit("frame-selected", {
-      animation: this.animation,
-      propertyName: this.propertyName,
-      offset: parseFloat(e.target.dataset.offset),
-      value: e.target.getAttribute("title"),
-      x: e.target.offsetLeft + e.target.closest(".frames").offsetLeft
-    });
-  }
-};
-
-let sortedUnique = arr => [...new Set(arr)].sort((a, b) => a > b);
-
-/**
- * Get a formatted title for this animation. This will be either:
- * "some-name", "some-name : CSS Transition", or "some-name : CSS Animation",
- * depending if the server provides the type, and what type it is.
- * @param {AnimationPlayerFront} animation
- */
-function getFormattedAnimationTitle({state}) {
-  // Older servers don't send the type.
-  return state.type
-    ? L10N.getFormatStr("timeline." + state.type + ".nameLabel", state.name)
-    : state.name;
-}
-
-/**
- * Turn propertyName into property-name.
- * @param {String} jsPropertyName A camelcased CSS property name. Typically
- * something that comes out of computed styles. E.g. borderBottomColor
- * @return {String} The corresponding CSS property name: border-bottom-color
- */
-function getCssPropertyName(jsPropertyName) {
-  return jsPropertyName.replace(/[A-Z]/g, "-$&").toLowerCase();
-}
-exports.getCssPropertyName = getCssPropertyName;
new file mode 100644
--- /dev/null
+++ b/devtools/client/animationinspector/components/animation-details.js
@@ -0,0 +1,160 @@
+"use strict";
+
+const {Cu} = require("chrome");
+const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
+const {
+  createNode,
+  TimeScale
+} = require("devtools/client/animationinspector/utils");
+const {Keyframes} = require("devtools/client/animationinspector/components/keyframes");
+/**
+ * UI component responsible for displaying detailed information for a given
+ * animation.
+ * This includes information about timing, easing, keyframes, animated
+ * properties.
+ */
+function AnimationDetails() {
+  EventEmitter.decorate(this);
+
+  this.onFrameSelected = this.onFrameSelected.bind(this);
+
+  this.keyframeComponents = [];
+}
+
+exports.AnimationDetails = AnimationDetails;
+
+AnimationDetails.prototype = {
+  // These are part of frame objects but are not animated properties. This
+  // array is used to skip them.
+  NON_PROPERTIES: ["easing", "composite", "computedOffset", "offset"],
+
+  init: function(containerEl) {
+    this.containerEl = containerEl;
+  },
+
+  destroy: function() {
+    this.unrender();
+    this.containerEl = null;
+  },
+
+  unrender: function() {
+    for (let component of this.keyframeComponents) {
+      component.off("frame-selected", this.onFrameSelected);
+      component.destroy();
+    }
+    this.keyframeComponents = [];
+
+    while (this.containerEl.firstChild) {
+      this.containerEl.firstChild.remove();
+    }
+  },
+
+  /**
+   * Convert a list of frames into a list of tracks, one per animated property,
+   * each with a list of frames.
+   */
+  getTracksFromFrames: function(frames) {
+    let tracks = {};
+
+    for (let frame of frames) {
+      for (let name in frame) {
+        if (this.NON_PROPERTIES.indexOf(name) != -1) {
+          continue;
+        }
+
+        if (!tracks[name]) {
+          tracks[name] = [];
+        }
+
+        tracks[name].push({
+          value: frame[name],
+          offset: frame.computedOffset
+        });
+      }
+    }
+
+    return tracks;
+  },
+
+  render: Task.async(function*(animation) {
+    this.unrender();
+
+    if (!animation) {
+      return;
+    }
+    this.animation = animation;
+
+    let frames = yield animation.getFrames();
+
+    // We might have been destroyed in the meantime, or the component might
+    // have been re-rendered.
+    if (!this.containerEl || this.animation !== animation) {
+      return;
+    }
+    // Useful for tests to know when the keyframes have been retrieved.
+    this.emit("keyframes-retrieved");
+
+    // Build an element for each animated property track.
+    this.tracks = this.getTracksFromFrames(frames);
+    for (let propertyName in this.tracks) {
+      let line = createNode({
+        parent: this.containerEl,
+        attributes: {"class": "property"}
+      });
+
+      createNode({
+        // text-overflow doesn't work in flex items, so we need a second level
+        // of container to actually have an ellipsis on the name.
+        // See bug 972664.
+        parent: createNode({
+          parent: line,
+          attributes: {"class": "name"},
+        }),
+        textContent: getCssPropertyName(propertyName)
+      });
+
+      // Add the keyframes diagram for this property.
+      let framesWrapperEl = createNode({
+        parent: line,
+        attributes: {"class": "track-container"}
+      });
+
+      let framesEl = createNode({
+        parent: framesWrapperEl,
+        attributes: {"class": "frames"}
+      });
+
+      // Scale the list of keyframes according to the current time scale.
+      let {x, w} = TimeScale.getAnimationDimensions(animation);
+      framesEl.style.left = `${x}%`;
+      framesEl.style.width = `${w}%`;
+
+      let keyframesComponent = new Keyframes();
+      keyframesComponent.init(framesEl);
+      keyframesComponent.render({
+        keyframes: this.tracks[propertyName],
+        propertyName: propertyName,
+        animation: animation
+      });
+      keyframesComponent.on("frame-selected", this.onFrameSelected);
+
+      this.keyframeComponents.push(keyframesComponent);
+    }
+  }),
+
+  onFrameSelected: function(e, args) {
+    // Relay the event up, it's needed in parents too.
+    this.emit(e, args);
+  }
+};
+
+/**
+ * Turn propertyName into property-name.
+ * @param {String} jsPropertyName A camelcased CSS property name. Typically
+ * something that comes out of computed styles. E.g. borderBottomColor
+ * @return {String} The corresponding CSS property name: border-bottom-color
+ */
+function getCssPropertyName(jsPropertyName) {
+  return jsPropertyName.replace(/[A-Z]/g, "-$&").toLowerCase();
+}
+exports.getCssPropertyName = getCssPropertyName;
new file mode 100644
--- /dev/null
+++ b/devtools/client/animationinspector/components/animation-target-node.js
@@ -0,0 +1,320 @@
+"use strict";
+
+const {Cu} = require("chrome");
+Cu.import("resource://devtools/client/shared/widgets/ViewHelpers.jsm");
+const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
+const {
+  createNode,
+  TargetNodeHighlighter
+} = require("devtools/client/animationinspector/utils");
+
+const STRINGS_URI = "chrome://devtools/locale/animationinspector.properties";
+const L10N = new ViewHelpers.L10N(STRINGS_URI);
+
+/**
+ * UI component responsible for displaying a preview of the target dom node of
+ * a given animation.
+ * @param {InspectorPanel} inspector Requires a reference to the inspector-panel
+ * to highlight and select the node, as well as refresh it when there are
+ * mutations.
+ * @param {Object} options Supported properties are:
+ * - compact {Boolean} Defaults to false. If true, nodes will be previewed like
+ *   tag#id.class instead of <tag id="id" class="class">
+ */
+function AnimationTargetNode(inspector, options = {}) {
+  this.inspector = inspector;
+  this.options = options;
+
+  this.onPreviewMouseOver = this.onPreviewMouseOver.bind(this);
+  this.onPreviewMouseOut = this.onPreviewMouseOut.bind(this);
+  this.onSelectNodeClick = this.onSelectNodeClick.bind(this);
+  this.onMarkupMutations = this.onMarkupMutations.bind(this);
+  this.onHighlightNodeClick = this.onHighlightNodeClick.bind(this);
+  this.onTargetHighlighterLocked = this.onTargetHighlighterLocked.bind(this);
+
+  EventEmitter.decorate(this);
+}
+
+exports.AnimationTargetNode = AnimationTargetNode;
+
+AnimationTargetNode.prototype = {
+  init: function(containerEl) {
+    let document = containerEl.ownerDocument;
+
+    // Init the markup for displaying the target node.
+    this.el = createNode({
+      parent: containerEl,
+      attributes: {
+        "class": "animation-target"
+      }
+    });
+
+    // Icon to select the node in the inspector.
+    this.highlightNodeEl = createNode({
+      parent: this.el,
+      nodeType: "span",
+      attributes: {
+        "class": "node-highlighter",
+        "title": L10N.getStr("node.highlightNodeLabel")
+      }
+    });
+
+    // Wrapper used for mouseover/out event handling.
+    this.previewEl = createNode({
+      parent: this.el,
+      nodeType: "span",
+      attributes: {
+        "title": L10N.getStr("node.selectNodeLabel")
+      }
+    });
+
+    if (!this.options.compact) {
+      this.previewEl.appendChild(document.createTextNode("<"));
+    }
+
+    // Tag name.
+    this.tagNameEl = createNode({
+      parent: this.previewEl,
+      nodeType: "span",
+      attributes: {
+        "class": "tag-name theme-fg-color3"
+      }
+    });
+
+    // Id attribute container.
+    this.idEl = createNode({
+      parent: this.previewEl,
+      nodeType: "span"
+    });
+
+    if (!this.options.compact) {
+      createNode({
+        parent: this.idEl,
+        nodeType: "span",
+        attributes: {
+          "class": "attribute-name theme-fg-color2"
+        },
+        textContent: "id"
+      });
+      this.idEl.appendChild(document.createTextNode("=\""));
+    } else {
+      createNode({
+        parent: this.idEl,
+        nodeType: "span",
+        attributes: {
+          "class": "theme-fg-color2"
+        },
+        textContent: "#"
+      });
+    }
+
+    createNode({
+      parent: this.idEl,
+      nodeType: "span",
+      attributes: {
+        "class": "attribute-value theme-fg-color6"
+      }
+    });
+
+    if (!this.options.compact) {
+      this.idEl.appendChild(document.createTextNode("\""));
+    }
+
+    // Class attribute container.
+    this.classEl = createNode({
+      parent: this.previewEl,
+      nodeType: "span"
+    });
+
+    if (!this.options.compact) {
+      createNode({
+        parent: this.classEl,
+        nodeType: "span",
+        attributes: {
+          "class": "attribute-name theme-fg-color2"
+        },
+        textContent: "class"
+      });
+      this.classEl.appendChild(document.createTextNode("=\""));
+    } else {
+      createNode({
+        parent: this.classEl,
+        nodeType: "span",
+        attributes: {
+          "class": "theme-fg-color6"
+        },
+        textContent: "."
+      });
+    }
+
+    createNode({
+      parent: this.classEl,
+      nodeType: "span",
+      attributes: {
+        "class": "attribute-value theme-fg-color6"
+      }
+    });
+
+    if (!this.options.compact) {
+      this.classEl.appendChild(document.createTextNode("\""));
+      this.previewEl.appendChild(document.createTextNode(">"));
+    }
+
+    this.startListeners();
+  },
+
+  startListeners: function() {
+    // Init events for highlighting and selecting the node.
+    this.previewEl.addEventListener("mouseover", this.onPreviewMouseOver);
+    this.previewEl.addEventListener("mouseout", this.onPreviewMouseOut);
+    this.previewEl.addEventListener("click", this.onSelectNodeClick);
+    this.highlightNodeEl.addEventListener("click", this.onHighlightNodeClick);
+
+    // Start to listen for markupmutation events.
+    this.inspector.on("markupmutation", this.onMarkupMutations);
+
+    // Listen to the target node highlighter.
+    TargetNodeHighlighter.on("highlighted", this.onTargetHighlighterLocked);
+  },
+
+  stopListeners: function() {
+    TargetNodeHighlighter.off("highlighted", this.onTargetHighlighterLocked);
+    this.inspector.off("markupmutation", this.onMarkupMutations);
+    this.previewEl.removeEventListener("mouseover", this.onPreviewMouseOver);
+    this.previewEl.removeEventListener("mouseout", this.onPreviewMouseOut);
+    this.previewEl.removeEventListener("click", this.onSelectNodeClick);
+    this.highlightNodeEl.removeEventListener("click", this.onHighlightNodeClick);
+  },
+
+  destroy: function() {
+    TargetNodeHighlighter.unhighlight().catch(e => console.error(e));
+
+    this.stopListeners();
+
+    this.el.remove();
+    this.el = this.tagNameEl = this.idEl = this.classEl = null;
+    this.highlightNodeEl = this.previewEl = null;
+    this.nodeFront = this.inspector = this.playerFront = null;
+  },
+
+  get highlighterUtils() {
+    if (this.inspector && this.inspector.toolbox) {
+      return this.inspector.toolbox.highlighterUtils;
+    }
+    return null;
+  },
+
+  onPreviewMouseOver: function() {
+    if (!this.nodeFront || !this.highlighterUtils) {
+      return;
+    }
+    this.highlighterUtils.highlightNodeFront(this.nodeFront)
+                         .catch(e => console.error(e));
+  },
+
+  onPreviewMouseOut: function() {
+    if (!this.nodeFront || !this.highlighterUtils) {
+      return;
+    }
+    this.highlighterUtils.unhighlight()
+                         .catch(e => console.error(e));
+  },
+
+  onSelectNodeClick: function() {
+    if (!this.nodeFront) {
+      return;
+    }
+    this.inspector.selection.setNodeFront(this.nodeFront, "animationinspector");
+  },
+
+  onHighlightNodeClick: function(e) {
+    e.stopPropagation();
+
+    let classList = this.highlightNodeEl.classList;
+
+    let isHighlighted = classList.contains("selected");
+    if (isHighlighted) {
+      classList.remove("selected");
+      TargetNodeHighlighter.unhighlight().then(() => {
+        this.emit("target-highlighter-unlocked");
+      }, e => console.error(e));
+    } else {
+      classList.add("selected");
+      TargetNodeHighlighter.highlight(this).then(() => {
+        this.emit("target-highlighter-locked");
+      }, e => console.error(e));
+    }
+  },
+
+  onTargetHighlighterLocked: function(e, animationTargetNode) {
+    if (animationTargetNode !== this) {
+      this.highlightNodeEl.classList.remove("selected");
+    }
+  },
+
+  onMarkupMutations: function(e, mutations) {
+    if (!this.nodeFront || !this.playerFront) {
+      return;
+    }
+
+    for (let {target} of mutations) {
+      if (target === this.nodeFront) {
+        // Re-render with the same nodeFront to update the output.
+        this.render(this.playerFront);
+        break;
+      }
+    }
+  },
+
+  render: Task.async(function*(playerFront) {
+    this.playerFront = playerFront;
+    this.nodeFront = undefined;
+
+    try {
+      this.nodeFront = yield this.inspector.walker.getNodeFromActor(
+                             playerFront.actorID, ["node"]);
+    } catch (e) {
+      if (!this.el) {
+        // The panel was destroyed in the meantime. Just log a warning.
+        console.warn("Cound't retrieve the animation target node, widget " +
+                     "destroyed");
+      } else {
+        // This was an unexpected error, log it.
+        console.error(e);
+      }
+      return;
+    }
+
+    if (!this.nodeFront || !this.el) {
+      return;
+    }
+
+    let {tagName, attributes} = this.nodeFront;
+
+    this.tagNameEl.textContent = tagName.toLowerCase();
+
+    let idIndex = attributes.findIndex(({name}) => name === "id");
+    if (idIndex > -1 && attributes[idIndex].value) {
+      this.idEl.querySelector(".attribute-value").textContent =
+        attributes[idIndex].value;
+      this.idEl.style.display = "inline";
+    } else {
+      this.idEl.style.display = "none";
+    }
+
+    let classIndex = attributes.findIndex(({name}) => name === "class");
+    if (classIndex > -1 && attributes[classIndex].value) {
+      let value = attributes[classIndex].value;
+      if (this.options.compact) {
+        value = value.split(" ").join(".");
+      }
+
+      this.classEl.querySelector(".attribute-value").textContent = value;
+      this.classEl.style.display = "inline";
+    } else {
+      this.classEl.style.display = "none";
+    }
+
+    this.emit("target-retrieved");
+  })
+};
new file mode 100644
--- /dev/null
+++ b/devtools/client/animationinspector/components/animation-time-block.js
@@ -0,0 +1,157 @@
+"use strict";
+
+const {Cu} = require("chrome");
+Cu.import("resource://devtools/client/shared/widgets/ViewHelpers.jsm");
+const {
+  createNode,
+  TimeScale
+} = require("devtools/client/animationinspector/utils");
+
+const STRINGS_URI = "chrome://devtools/locale/animationinspector.properties";
+const L10N = new ViewHelpers.L10N(STRINGS_URI);
+
+/**
+ * UI component responsible for displaying a single animation timeline, which
+ * basically looks like a rectangle that shows the delay and iterations.
+ */
+function AnimationTimeBlock() {
+  EventEmitter.decorate(this);
+  this.onClick = this.onClick.bind(this);
+}
+
+exports.AnimationTimeBlock = AnimationTimeBlock;
+
+AnimationTimeBlock.prototype = {
+  init: function(containerEl) {
+    this.containerEl = containerEl;
+    this.containerEl.addEventListener("click", this.onClick);
+  },
+
+  destroy: function() {
+    this.containerEl.removeEventListener("click", this.onClick);
+    this.unrender();
+    this.containerEl = null;
+    this.animation = null;
+  },
+
+  unrender: function() {
+    while (this.containerEl.firstChild) {
+      this.containerEl.firstChild.remove();
+    }
+  },
+
+  render: function(animation) {
+    this.unrender();
+
+    this.animation = animation;
+    let {state} = this.animation;
+
+    // Create a container element to hold the delay and iterations.
+    // It is positioned according to its delay (divided by the playbackrate),
+    // and its width is according to its duration (divided by the playbackrate).
+    let {x, iterationW, delayX, delayW, negativeDelayW} =
+      TimeScale.getAnimationDimensions(animation);
+
+    let iterations = createNode({
+      parent: this.containerEl,
+      attributes: {
+        "class": state.type + " iterations" +
+                 (state.iterationCount ? "" : " infinite"),
+        // Individual iterations are represented by setting the size of the
+        // repeating linear-gradient.
+        "style": `left:${x}%;
+                  width:${iterationW}%;
+                  background-size:${100 / (state.iterationCount || 1)}% 100%;`
+      }
+    });
+
+    // The animation name is displayed over the iterations.
+    // Note that in case of negative delay, we push the name towards the right
+    // so the delay can be shown.
+    createNode({
+      parent: iterations,
+      attributes: {
+        "class": "name",
+        "title": this.getTooltipText(state),
+        // Make space for the negative delay with a margin-left.
+        "style": `margin-left:${negativeDelayW}%`
+      },
+      textContent: state.name
+    });
+
+    // Delay.
+    if (state.delay) {
+      // Negative delays need to start at 0.
+      createNode({
+        parent: iterations,
+        attributes: {
+          "class": "delay" + (state.delay < 0 ? " negative" : ""),
+          "style": `left:-${delayX}%;
+                    width:${delayW}%;`
+        }
+      });
+    }
+  },
+
+  getTooltipText: function(state) {
+    let getTime = time => L10N.getFormatStr("player.timeLabel",
+                            L10N.numberWithDecimals(time / 1000, 2));
+
+    let text = "";
+
+    // Adding the name.
+    text += getFormattedAnimationTitle({state});
+    text += "\n";
+
+    // Adding the delay.
+    text += L10N.getStr("player.animationDelayLabel") + " ";
+    text += getTime(state.delay);
+    text += "\n";
+
+    // Adding the duration.
+    text += L10N.getStr("player.animationDurationLabel") + " ";
+    text += getTime(state.duration);
+    text += "\n";
+
+    // Adding the iteration count (the infinite symbol, or an integer).
+    if (state.iterationCount !== 1) {
+      text += L10N.getStr("player.animationIterationCountLabel") + " ";
+      text += state.iterationCount ||
+              L10N.getStr("player.infiniteIterationCountText");
+      text += "\n";
+    }
+
+    // Adding the playback rate if it's different than 1.
+    if (state.playbackRate !== 1) {
+      text += L10N.getStr("player.animationRateLabel") + " ";
+      text += state.playbackRate;
+      text += "\n";
+    }
+
+    // Adding a note that the animation is running on the compositor thread if
+    // needed.
+    if (state.isRunningOnCompositor) {
+      text += L10N.getStr("player.runningOnCompositorTooltip");
+    }
+
+    return text;
+  },
+
+  onClick: function(e) {
+    e.stopPropagation();
+    this.emit("selected", this.animation);
+  }
+};
+
+/**
+ * Get a formatted title for this animation. This will be either:
+ * "some-name", "some-name : CSS Transition", or "some-name : CSS Animation",
+ * depending if the server provides the type, and what type it is.
+ * @param {AnimationPlayerFront} animation
+ */
+function getFormattedAnimationTitle({state}) {
+  // Older servers don't send the type.
+  return state.type
+    ? L10N.getFormatStr("timeline." + state.type + ".nameLabel", state.name)
+    : state.name;
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/animationinspector/components/animation-timeline.js
@@ -0,0 +1,433 @@
+"use strict";
+
+const {
+  createNode,
+  drawGraphElementBackground,
+  findOptimalTimeInterval,
+  TimeScale
+} = require("devtools/client/animationinspector/utils");
+const {AnimationDetails} = require("devtools/client/animationinspector/components/animation-details");
+const {AnimationTargetNode} = require("devtools/client/animationinspector/components/animation-target-node");
+const {AnimationTimeBlock} = require("devtools/client/animationinspector/components/animation-time-block");
+
+// The minimum spacing between 2 time graduation headers in the timeline (px).
+const TIME_GRADUATION_MIN_SPACING = 40;
+// When the container window is resized, the timeline background gets refreshed,
+// but only after a timer, and the timer is reset if the window is continuously
+// resized.
+const TIMELINE_BACKGROUND_RESIZE_DEBOUNCE_TIMER = 50;
+
+/**
+ * UI component responsible for displaying a timeline for animations.
+ * The timeline is essentially a graph with time along the x axis and animations
+ * along the y axis.
+ * The time is represented with a graduation header at the top and a current
+ * time play head.
+ * Animations are organized by lines, with a left margin containing the preview
+ * of the target DOM element the animation applies to.
+ * The current time play head can be moved by clicking/dragging in the header.
+ * when this happens, the component emits "current-data-changed" events with the
+ * new time and state of the timeline.
+ *
+ * @param {InspectorPanel} inspector.
+ */
+function AnimationsTimeline(inspector) {
+  this.animations = [];
+  this.targetNodes = [];
+  this.timeBlocks = [];
+  this.details = [];
+  this.inspector = inspector;
+
+  this.onAnimationStateChanged = this.onAnimationStateChanged.bind(this);
+  this.onScrubberMouseDown = this.onScrubberMouseDown.bind(this);
+  this.onScrubberMouseUp = this.onScrubberMouseUp.bind(this);
+  this.onScrubberMouseOut = this.onScrubberMouseOut.bind(this);
+  this.onScrubberMouseMove = this.onScrubberMouseMove.bind(this);
+  this.onAnimationSelected = this.onAnimationSelected.bind(this);
+  this.onWindowResize = this.onWindowResize.bind(this);
+  this.onFrameSelected = this.onFrameSelected.bind(this);
+
+  EventEmitter.decorate(this);
+}
+
+exports.AnimationsTimeline = AnimationsTimeline;
+
+AnimationsTimeline.prototype = {
+  init: function(containerEl) {
+    this.win = containerEl.ownerDocument.defaultView;
+
+    this.rootWrapperEl = createNode({
+      parent: containerEl,
+      attributes: {
+        "class": "animation-timeline"
+      }
+    });
+
+    let scrubberContainer = createNode({
+      parent: this.rootWrapperEl,
+      attributes: {"class": "scrubber-wrapper track-container"}
+    });
+
+    this.scrubberEl = createNode({
+      parent: scrubberContainer,
+      attributes: {
+        "class": "scrubber"
+      }
+    });
+
+    this.scrubberHandleEl = createNode({
+      parent: this.scrubberEl,
+      attributes: {
+        "class": "scrubber-handle"
+      }
+    });
+    this.scrubberHandleEl.addEventListener("mousedown", this.onScrubberMouseDown);
+
+    this.timeHeaderEl = createNode({
+      parent: this.rootWrapperEl,
+      attributes: {
+        "class": "time-header track-container"
+      }
+    });
+    this.timeHeaderEl.addEventListener("mousedown", this.onScrubberMouseDown);
+
+    this.animationsEl = createNode({
+      parent: this.rootWrapperEl,
+      nodeType: "ul",
+      attributes: {
+        "class": "animations"
+      }
+    });
+
+    this.win.addEventListener("resize", this.onWindowResize);
+  },
+
+  destroy: function() {
+    this.stopAnimatingScrubber();
+    this.unrender();
+
+    this.win.removeEventListener("resize", this.onWindowResize);
+    this.timeHeaderEl.removeEventListener("mousedown",
+      this.onScrubberMouseDown);
+    this.scrubberHandleEl.removeEventListener("mousedown",
+      this.onScrubberMouseDown);
+
+    this.rootWrapperEl.remove();
+    this.animations = [];
+
+    this.rootWrapperEl = null;
+    this.timeHeaderEl = null;
+    this.animationsEl = null;
+    this.scrubberEl = null;
+    this.scrubberHandleEl = null;
+    this.win = null;
+    this.inspector = null;
+  },
+
+  /**
+   * Destroy sub-components that have been created and stored on this instance.
+   * @param {String} name An array of components will be expected in this[name]
+   * @param {Array} handlers An option list of event handlers information that
+   * should be used to remove these handlers.
+   */
+  destroySubComponents: function(name, handlers = []) {
+    for (let component of this[name]) {
+      for (let {event, fn} of handlers) {
+        component.off(event, fn);
+      }
+      component.destroy();
+    }
+    this[name] = [];
+  },
+
+  unrender: function() {
+    for (let animation of this.animations) {
+      animation.off("changed", this.onAnimationStateChanged);
+    }
+    TimeScale.reset();
+    this.destroySubComponents("targetNodes");
+    this.destroySubComponents("timeBlocks");
+    this.destroySubComponents("details", [{
+      event: "frame-selected",
+      fn: this.onFrameSelected
+    }]);
+    this.animationsEl.innerHTML = "";
+  },
+
+  onWindowResize: function() {
+    if (this.windowResizeTimer) {
+      this.win.clearTimeout(this.windowResizeTimer);
+    }
+
+    this.windowResizeTimer = this.win.setTimeout(() => {
+      this.drawHeaderAndBackground();
+    }, TIMELINE_BACKGROUND_RESIZE_DEBOUNCE_TIMER);
+  },
+
+  onAnimationSelected: function(e, animation) {
+    let index = this.animations.indexOf(animation);
+    if (index === -1) {
+      return;
+    }
+
+    let el = this.rootWrapperEl;
+    let animationEl = el.querySelectorAll(".animation")[index];
+    let propsEl = el.querySelectorAll(".animated-properties")[index];
+
+    // Toggle the selected state on this animation.
+    animationEl.classList.toggle("selected");
+    propsEl.classList.toggle("selected");
+
+    // Render the details component for this animation if it was shown.
+    if (animationEl.classList.contains("selected")) {
+      this.details[index].render(animation);
+      this.emit("animation-selected", animation);
+    } else {
+      this.emit("animation-unselected", animation);
+    }
+  },
+
+  /**
+   * When a frame gets selected, move the scrubber to the corresponding position
+   */
+  onFrameSelected: function(e, {x}) {
+    this.moveScrubberTo(x, true);
+  },
+
+  onScrubberMouseDown: function(e) {
+    this.moveScrubberTo(e.pageX);
+    this.win.addEventListener("mouseup", this.onScrubberMouseUp);
+    this.win.addEventListener("mouseout", this.onScrubberMouseOut);
+    this.win.addEventListener("mousemove", this.onScrubberMouseMove);
+
+    // Prevent text selection while dragging.
+    e.preventDefault();
+  },
+
+  onScrubberMouseUp: function() {
+    this.cancelTimeHeaderDragging();
+  },
+
+  onScrubberMouseOut: function(e) {
+    // Check that mouseout happened on the window itself, and if yes, cancel
+    // the dragging.
+    if (!this.win.document.contains(e.relatedTarget)) {
+      this.cancelTimeHeaderDragging();
+    }
+  },
+
+  cancelTimeHeaderDragging: function() {
+    this.win.removeEventListener("mouseup", this.onScrubberMouseUp);
+    this.win.removeEventListener("mouseout", this.onScrubberMouseOut);
+    this.win.removeEventListener("mousemove", this.onScrubberMouseMove);
+  },
+
+  onScrubberMouseMove: function(e) {
+    this.moveScrubberTo(e.pageX);
+  },
+
+  moveScrubberTo: function(pageX, noOffset) {
+    this.stopAnimatingScrubber();
+
+    // The offset needs to be in % and relative to the timeline's area (so we
+    // subtract the scrubber's left offset, which is equal to the sidebar's
+    // width).
+    let offset = pageX;
+    if (!noOffset) {
+      offset -= this.timeHeaderEl.offsetLeft;
+    }
+    offset = offset * 100 / this.timeHeaderEl.offsetWidth;
+    if (offset < 0) {
+      offset = 0;
+    }
+
+    this.scrubberEl.style.left = offset + "%";
+
+    let time = TimeScale.distanceToRelativeTime(offset);
+
+    this.emit("timeline-data-changed", {
+      isPaused: true,
+      isMoving: false,
+      isUserDrag: true,
+      time: time
+    });
+  },
+
+  render: function(animations, documentCurrentTime) {
+    this.unrender();
+
+    this.animations = animations;
+    if (!this.animations.length) {
+      return;
+    }
+
+    // Loop first to set the time scale for all current animations.
+    for (let {state} of animations) {
+      TimeScale.addAnimation(state);
+    }
+
+    this.drawHeaderAndBackground();
+
+    for (let animation of this.animations) {
+      animation.on("changed", this.onAnimationStateChanged);
+
+      // Each line contains the target animated node and the animation time
+      // block.
+      let animationEl = createNode({
+        parent: this.animationsEl,
+        nodeType: "li",
+        attributes: {
+          "class": "animation" + (animation.state.isRunningOnCompositor
+                                  ? " fast-track"
+                                  : "")
+        }
+      });
+
+      // Right below the line is a hidden-by-default line for displaying the
+      // inline keyframes.
+      let detailsEl = createNode({
+        parent: this.animationsEl,
+        nodeType: "li",
+        attributes: {
+          "class": "animated-properties"
+        }
+      });
+
+      let details = new AnimationDetails();
+      details.init(detailsEl);
+      details.on("frame-selected", this.onFrameSelected);
+      this.details.push(details);
+
+      // Left sidebar for the animated node.
+      let animatedNodeEl = createNode({
+        parent: animationEl,
+        attributes: {
+          "class": "target"
+        }
+      });
+
+      // Draw the animated node target.
+      let targetNode = new AnimationTargetNode(this.inspector, {compact: true});
+      targetNode.init(animatedNodeEl);
+      targetNode.render(animation);
+      this.targetNodes.push(targetNode);
+
+      // Right-hand part contains the timeline itself (called time-block here).
+      let timeBlockEl = createNode({
+        parent: animationEl,
+        attributes: {
+          "class": "time-block track-container"
+        }
+      });
+
+      // Draw the animation time block.
+      let timeBlock = new AnimationTimeBlock();
+      timeBlock.init(timeBlockEl);
+      timeBlock.render(animation);
+      this.timeBlocks.push(timeBlock);
+
+      timeBlock.on("selected", this.onAnimationSelected);
+    }
+
+    // Use the document's current time to position the scrubber (if the server
+    // doesn't provide it, hide the scrubber entirely).
+    // Note that because the currentTime was sent via the protocol, some time
+    // may have gone by since then, and so the scrubber might be a bit late.
+    if (!documentCurrentTime) {
+      this.scrubberEl.style.display = "none";
+    } else {
+      this.scrubberEl.style.display = "block";
+      this.startAnimatingScrubber(this.wasRewound()
+                                  ? TimeScale.minStartTime
+                                  : documentCurrentTime);
+    }
+  },
+
+  isAtLeastOneAnimationPlaying: function() {
+    return this.animations.some(({state}) => state.playState === "running");
+  },
+
+  wasRewound: function() {
+    return !this.isAtLeastOneAnimationPlaying() &&
+           this.animations.every(({state}) => state.currentTime === 0);
+  },
+
+  hasInfiniteAnimations: function() {
+    return this.animations.some(({state}) => !state.iterationCount);
+  },
+
+  startAnimatingScrubber: function(time) {
+    let x = TimeScale.startTimeToDistance(time);
+    this.scrubberEl.style.left = x + "%";
+
+    // Only stop the scrubber if it's out of bounds or all animations have been
+    // paused, but not if at least an animation is infinite.
+    let isOutOfBounds = time < TimeScale.minStartTime ||
+                        time > TimeScale.maxEndTime;
+    let isAllPaused = !this.isAtLeastOneAnimationPlaying();
+    let hasInfinite = this.hasInfiniteAnimations();
+
+    if (isAllPaused || (isOutOfBounds && !hasInfinite)) {
+      this.stopAnimatingScrubber();
+      this.emit("timeline-data-changed", {
+        isPaused: !this.isAtLeastOneAnimationPlaying(),
+        isMoving: false,
+        isUserDrag: false,
+        time: TimeScale.distanceToRelativeTime(x)
+      });
+      return;
+    }
+
+    this.emit("timeline-data-changed", {
+      isPaused: false,
+      isMoving: true,
+      isUserDrag: false,
+      time: TimeScale.distanceToRelativeTime(x)
+    });
+
+    let now = this.win.performance.now();
+    this.rafID = this.win.requestAnimationFrame(() => {
+      if (!this.rafID) {
+        // In case the scrubber was stopped in the meantime.
+        return;
+      }
+      this.startAnimatingScrubber(time + this.win.performance.now() - now);
+    });
+  },
+
+  stopAnimatingScrubber: function() {
+    if (this.rafID) {
+      this.win.cancelAnimationFrame(this.rafID);
+      this.rafID = null;
+    }
+  },
+
+  onAnimationStateChanged: function() {
+    // For now, simply re-render the component. The animation front's state has
+    // already been updated.
+    this.render(this.animations);
+  },
+
+  drawHeaderAndBackground: function() {
+    let width = this.timeHeaderEl.offsetWidth;
+    let scale = width / (TimeScale.maxEndTime - TimeScale.minStartTime);
+    drawGraphElementBackground(this.win.document, "time-graduations",
+                               width, scale);
+
+    // And the time graduation header.
+    this.timeHeaderEl.innerHTML = "";
+    let interval = findOptimalTimeInterval(scale, TIME_GRADUATION_MIN_SPACING);
+    for (let i = 0; i < width; i += interval) {
+      let pos = 100 * i / width;
+      createNode({
+        parent: this.timeHeaderEl,
+        nodeType: "span",
+        attributes: {
+          "class": "time-tick",
+          "style": `left:${pos}%`
+        },
+        textContent: TimeScale.formatTime(TimeScale.distanceToRelativeTime(pos))
+      });
+    }
+  }
+};
new file mode 100644
--- /dev/null
+++ b/devtools/client/animationinspector/components/keyframes.js
@@ -0,0 +1,70 @@
+"use strict";
+
+const {Cu} = require("chrome");
+Cu.import("resource://devtools/client/shared/widgets/ViewHelpers.jsm");
+const {createNode} = require("devtools/client/animationinspector/utils");
+
+/**
+ * UI component responsible for displaying a list of keyframes.
+ */
+function Keyframes() {
+  EventEmitter.decorate(this);
+  this.onClick = this.onClick.bind(this);
+}
+
+exports.Keyframes = Keyframes;
+
+Keyframes.prototype = {
+  init: function(containerEl) {
+    this.containerEl = containerEl;
+
+    this.keyframesEl = createNode({
+      parent: this.containerEl,
+      attributes: {"class": "keyframes"}
+    });
+
+    this.containerEl.addEventListener("click", this.onClick);
+  },
+
+  destroy: function() {
+    this.containerEl.removeEventListener("click", this.onClick);
+    this.keyframesEl.remove();
+    this.containerEl = this.keyframesEl = this.animation = null;
+  },
+
+  render: function({keyframes, propertyName, animation}) {
+    this.keyframes = keyframes;
+    this.propertyName = propertyName;
+    this.animation = animation;
+
+    this.keyframesEl.classList.add(animation.state.type);
+    for (let frame of this.keyframes) {
+      createNode({
+        parent: this.keyframesEl,
+        attributes: {
+          "class": "frame",
+          "style": `left:${frame.offset * 100}%;`,
+          "data-offset": frame.offset,
+          "data-property": propertyName,
+          "title": frame.value
+        }
+      });
+    }
+  },
+
+  onClick: function(e) {
+    // If the click happened on a frame, tell our parent about it.
+    if (!e.target.classList.contains("frame")) {
+      return;
+    }
+
+    e.stopPropagation();
+    this.emit("frame-selected", {
+      animation: this.animation,
+      propertyName: this.propertyName,
+      offset: parseFloat(e.target.dataset.offset),
+      value: e.target.getAttribute("title"),
+      x: e.target.offsetLeft + e.target.closest(".frames").offsetLeft
+    });
+  }
+};
new file mode 100644
--- /dev/null
+++ b/devtools/client/animationinspector/components/moz.build
@@ -0,0 +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/.
+
+DevToolsModules(
+    'animation-details.js',
+    'animation-target-node.js',
+    'animation-time-block.js',
+    'animation-timeline.js',
+    'keyframes.js',
+    'rate-selector.js'
+)
new file mode 100644
--- /dev/null
+++ b/devtools/client/animationinspector/components/rate-selector.js
@@ -0,0 +1,95 @@
+"use strict";
+
+const {Cu} = require("chrome");
+Cu.import("resource://devtools/client/shared/widgets/ViewHelpers.jsm");
+const {createNode} = require("devtools/client/animationinspector/utils");
+const STRINGS_URI = "chrome://devtools/locale/animationinspector.properties";
+const L10N = new ViewHelpers.L10N(STRINGS_URI);
+// List of playback rate presets displayed in the timeline toolbar.
+const PLAYBACK_RATES = [.1, .25, .5, 1, 2, 5, 10];
+
+/**
+ * UI component responsible for displaying a playback rate selector UI.
+ * The rendering logic is such that a predefined list of rates is generated.
+ * If *all* animations passed to render share the same rate, then that rate is
+ * selected in the <select> element, otherwise, the empty value is selected.
+ * If the rate that all animations share isn't part of the list of predefined
+ * rates, than that rate is added to the list.
+ */
+function RateSelector() {
+  this.onRateChanged = this.onRateChanged.bind(this);
+  EventEmitter.decorate(this);
+}
+
+exports.RateSelector = RateSelector;
+
+RateSelector.prototype = {
+  init: function(containerEl) {
+    this.selectEl = createNode({
+      parent: containerEl,
+      nodeType: "select",
+      attributes: {"class": "devtools-button"}
+    });
+
+    this.selectEl.addEventListener("change", this.onRateChanged);
+  },
+
+  destroy: function() {
+    this.selectEl.removeEventListener("change", this.onRateChanged);
+    this.selectEl.remove();
+    this.selectEl = null;
+  },
+
+  getAnimationsRates: function(animations) {
+    return sortedUnique(animations.map(a => a.state.playbackRate));
+  },
+
+  getAllRates: function(animations) {
+    let animationsRates = this.getAnimationsRates(animations);
+    if (animationsRates.length > 1) {
+      return PLAYBACK_RATES;
+    }
+
+    return sortedUnique(PLAYBACK_RATES.concat(animationsRates));
+  },
+
+  render: function(animations) {
+    let allRates = this.getAnimationsRates(animations);
+    let hasOneRate = allRates.length === 1;
+
+    this.selectEl.innerHTML = "";
+
+    if (!hasOneRate) {
+      // When the animations displayed have mixed playback rates, we can't
+      // select any of the predefined ones, instead, insert an empty rate.
+      createNode({
+        parent: this.selectEl,
+        nodeType: "option",
+        attributes: {value: "", selector: "true"},
+        textContent: "-"
+      });
+    }
+    for (let rate of this.getAllRates(animations)) {
+      let option = createNode({
+        parent: this.selectEl,
+        nodeType: "option",
+        attributes: {value: rate},
+        textContent: L10N.getFormatStr("player.playbackRateLabel", rate)
+      });
+
+      // If there's only one rate and this is the option for it, select it.
+      if (hasOneRate && rate === allRates[0]) {
+        option.setAttribute("selected", "true");
+      }
+    }
+  },
+
+  onRateChanged: function() {
+    let rate = parseFloat(this.selectEl.value);
+    if (!isNaN(rate)) {
+      this.emit("rate-changed", rate);
+    }
+  }
+};
+
+let sortedUnique = arr => [...new Set(arr)].sort((a, b) => a > b);
--- a/devtools/client/animationinspector/moz.build
+++ b/devtools/client/animationinspector/moz.build
@@ -2,12 +2,15 @@
 # vim: set filetype=python:
 # 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/.
 
 BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
 XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
 
+DIRS += [
+    'components'
+]
+
 DevToolsModules(
-    'components.js',
     'utils.js',
 )
--- a/devtools/client/animationinspector/test/browser_animation_timeline_header.js
+++ b/devtools/client/animationinspector/test/browser_animation_timeline_header.js
@@ -3,19 +3,21 @@
  http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 requestLongerTimeout(2);
 
 // Check that the timeline shows correct time graduations in the header.
 
-const {findOptimalTimeInterval} = require("devtools/client/animationinspector/utils");
-const {TimeScale} = require("devtools/client/animationinspector/components");
-// Should be kept in sync with TIME_GRADUATION_MIN_SPACING in components.js
+const {
+  findOptimalTimeInterval,
+  TimeScale
+} = require("devtools/client/animationinspector/utils");
+// Should be kept in sync with TIME_GRADUATION_MIN_SPACING in animation-timeline.js
 const TIME_GRADUATION_MIN_SPACING = 40;
 
 add_task(function*() {
   yield addTab(TEST_URL_ROOT + "doc_simple_animation.html");
   let {panel} = yield openAnimationInspector();
 
   let timeline = panel.animationsTimelineComponent;
   let headerEl = timeline.timeHeaderEl;
--- a/devtools/client/animationinspector/test/unit/test_getCssPropertyName.js
+++ b/devtools/client/animationinspector/test/unit/test_getCssPropertyName.js
@@ -2,17 +2,17 @@
 /* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 var Cu = Components.utils;
 const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const {getCssPropertyName} = require("devtools/client/animationinspector/components");
+const {getCssPropertyName} = require("devtools/client/animationinspector/components/animation-details");
 
 const TEST_DATA = [{
   jsName: "alllowercase",
   cssName: "alllowercase"
 }, {
   jsName: "borderWidth",
   cssName: "border-width"
 }, {
--- a/devtools/client/animationinspector/test/unit/test_timeScale.js
+++ b/devtools/client/animationinspector/test/unit/test_timeScale.js
@@ -2,18 +2,17 @@
 /* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 var Cu = Components.utils;
 const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const {TimeScale} = require("devtools/client/animationinspector/components");
-
+const {TimeScale} = require("devtools/client/animationinspector/utils");
 const TEST_ANIMATIONS = [{
   desc: "Testing a few standard animations",
   animations: [{
     previousStartTime: 500,
     delay: 0,
     duration: 1000,
     iterationCount: 1,
     playbackRate: 1
--- a/devtools/client/animationinspector/utils.js
+++ b/devtools/client/animationinspector/utils.js
@@ -2,36 +2,41 @@
 /* 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/. */
 
 "use strict";
 
 const {Cu} = require("chrome");
+Cu.import("resource://devtools/client/shared/widgets/ViewHelpers.jsm");
 const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
 var {loader} = Cu.import("resource://devtools/shared/Loader.jsm");
 loader.lazyRequireGetter(this, "EventEmitter",
                                "devtools/shared/event-emitter");
 
+const STRINGS_URI = "chrome://devtools/locale/animationinspector.properties";
+const L10N = new ViewHelpers.L10N(STRINGS_URI);
 // How many times, maximum, can we loop before we find the optimal time
 // interval in the timeline graph.
 const OPTIMAL_TIME_INTERVAL_MAX_ITERS = 100;
 // Background time graduations should be multiple of this number of millis.
 const TIME_INTERVAL_MULTIPLE = 25;
 const TIME_INTERVAL_SCALES = 3;
 // The default minimum spacing between time graduations in px.
 const TIME_GRADUATION_MIN_SPACING = 10;
 // RGB color for the time interval background.
 const TIME_INTERVAL_COLOR = [128, 136, 144];
 // byte
 const TIME_INTERVAL_OPACITY_MIN = 32;
 // byte
 const TIME_INTERVAL_OPACITY_ADD = 32;
 
+const MILLIS_TIME_FORMAT_MAX_DURATION = 4000;
+
 /**
  * DOM node creation helper function.
  * @param {Object} Options to customize the node to be created.
  * - nodeType {String} Optional, defaults to "div",
  * - attributes {Object} Optional attributes object like
  *   {attrName1:value1, attrName2: value2, ...}
  * - parent {DOMNode} Mandatory node to append the newly created node to.
  * - textContent {String} Optional text for the node.
@@ -203,8 +208,144 @@ function formatStopwatchTime(time) {
   minutes = pad(minutes, 10);
   seconds = pad(seconds, 10);
   milliseconds = pad(milliseconds, 100);
 
   return `${minutes}:${seconds}.${milliseconds}`;
 }
 
 exports.formatStopwatchTime = formatStopwatchTime;
+
+/**
+ * The TimeScale helper object is used to know which size should something be
+ * displayed with in the animation panel, depending on the animations that are
+ * currently displayed.
+ * If there are 5 animations displayed, and the first one starts at 10000ms and
+ * the last one ends at 20000ms, then this helper can be used to convert any
+ * time in this range to a distance in pixels.
+ *
+ * For the helper to know how to convert, it needs to know all the animations.
+ * Whenever a new animation is added to the panel, addAnimation(state) should be
+ * called. reset() can be called to start over.
+ */
+var TimeScale = {
+  minStartTime: Infinity,
+  maxEndTime: 0,
+
+  /**
+   * Add a new animation to time scale.
+   * @param {Object} state A PlayerFront.state object.
+   */
+  addAnimation: function(state) {
+    let {previousStartTime, delay, duration,
+         iterationCount, playbackRate} = state;
+
+    // Negative-delayed animations have their startTimes set such that we would
+    // be displaying the delay outside the time window if we didn't take it into
+    // account here.
+    let relevantDelay = delay < 0 ? delay / playbackRate : 0;
+    previousStartTime = previousStartTime || 0;
+
+    this.minStartTime = Math.min(this.minStartTime,
+                                 previousStartTime + relevantDelay);
+    let length = (delay / playbackRate) +
+                 ((duration / playbackRate) *
+                  (!iterationCount ? 1 : iterationCount));
+    let endTime = previousStartTime + length;
+    this.maxEndTime = Math.max(this.maxEndTime, endTime);
+  },
+
+  /**
+   * Reset the current time scale.
+   */
+  reset: function() {
+    this.minStartTime = Infinity;
+    this.maxEndTime = 0;
+  },
+
+  /**
+   * Convert a startTime to a distance in %, in the current time scale.
+   * @param {Number} time
+   * @return {Number}
+   */
+  startTimeToDistance: function(time) {
+    time -= this.minStartTime;
+    return this.durationToDistance(time);
+  },
+
+  /**
+   * Convert a duration to a distance in %, in the current time scale.
+   * @param {Number} time
+   * @return {Number}
+   */
+  durationToDistance: function(duration) {
+    return duration * 100 / this.getDuration();
+  },
+
+  /**
+   * Convert a distance in % to a time, in the current time scale.
+   * @param {Number} distance
+   * @return {Number}
+   */
+  distanceToTime: function(distance) {
+    return this.minStartTime + (this.getDuration() * distance / 100);
+  },
+
+  /**
+   * Convert a distance in % to a time, in the current time scale.
+   * The time will be relative to the current minimum start time.
+   * @param {Number} distance
+   * @return {Number}
+   */
+  distanceToRelativeTime: function(distance) {
+    let time = this.distanceToTime(distance);
+    return time - this.minStartTime;
+  },
+
+  /**
+   * Depending on the time scale, format the given time as milliseconds or
+   * seconds.
+   * @param {Number} time
+   * @return {String} The formatted time string.
+   */
+  formatTime: function(time) {
+    // Format in milliseconds if the total duration is short enough.
+    if (this.getDuration() <= MILLIS_TIME_FORMAT_MAX_DURATION) {
+      return L10N.getFormatStr("timeline.timeGraduationLabel", time.toFixed(0));
+    }
+
+    // Otherwise format in seconds.
+    return L10N.getFormatStr("player.timeLabel", (time / 1000).toFixed(1));
+  },
+
+  getDuration: function() {
+    return this.maxEndTime - this.minStartTime;
+  },
+
+  /**
+   * Given an animation, get the various dimensions (in %) useful to draw the
+   * animation in the timeline.
+   */
+  getAnimationDimensions: function({state}) {
+    let start = state.previousStartTime || 0;
+    let duration = state.duration;
+    let rate = state.playbackRate;
+    let count = state.iterationCount;
+    let delay = state.delay || 0;
+
+    // The start position.
+    let x = this.startTimeToDistance(start + (delay / rate));
+    // The width for a single iteration.
+    let w = this.durationToDistance(duration / rate);
+    // The width for all iterations.
+    let iterationW = w * (count || 1);
+    // The start position of the delay.
+    let delayX = this.durationToDistance((delay < 0 ? 0 : delay) / rate);
+    // The width of the delay.
+    let delayW = this.durationToDistance(Math.abs(delay) / rate);
+    // The width of the delay if it is positive, 0 otherwise.
+    let negativeDelayW = delay < 0 ? delayW : 0;
+
+    return {x, w, iterationW, delayX, delayW, negativeDelayW};
+  }
+};
+
+exports.TimeScale = TimeScale;
--- a/devtools/client/debugger/test/mochitest/browser_dbg_source-maps-01.js
+++ b/devtools/client/debugger/test/mochitest/browser_dbg_source-maps-01.js
@@ -74,25 +74,23 @@ function testSetBreakpoint() {
   return deferred.promise;
 }
 
 function testSetBreakpointBlankLine() {
   let deferred = promise.defer();
   let sourceForm = getSourceForm(gSources, COFFEE_URL);
 
   let source = gDebugger.gThreadClient.source(sourceForm);
-  source.setBreakpoint({ line: 7 }, aResponse => {
+  source.setBreakpoint({ line: 8 }, aResponse => {
     ok(!aResponse.error,
-      "Should be able to set a breakpoint in a coffee source file on a blank line.");
-    ok(aResponse.actualLocation,
-      "Because 7 is empty, we should have an actualLocation.");
-    is(aResponse.actualLocation.source.url, COFFEE_URL,
-      "actualLocation.actor should be source mapped to the coffee file.");
-    is(aResponse.actualLocation.line, 8,
-      "actualLocation.line should be source mapped back to 8.");
+       "Should be able to set a breakpoint in a coffee source file on a blank line.");
+    ok(!aResponse.isPending,
+       "Should not be a pending breakpoint.");
+    ok(!aResponse.actualLocation,
+       "Should not be a moved breakpoint.");
 
     deferred.resolve();
   });
 
   return deferred.promise;
 }
 
 function testHitBreakpoint() {
--- a/devtools/client/inspector/rules/test/browser.ini
+++ b/devtools/client/inspector/rules/test/browser.ini
@@ -37,16 +37,18 @@ support-files =
 [browser_rules_add-property_02.js]
 [browser_rules_add-property-svg.js]
 [browser_rules_add-rule_01.js]
 [browser_rules_add-rule_02.js]
 [browser_rules_add-rule_03.js]
 [browser_rules_add-rule_04.js]
 [browser_rules_add-rule_pseudo_class.js]
 [browser_rules_authored.js]
+[browser_rules_authored_color.js]
+[browser_rules_authored_override.js]
 [browser_rules_colorpicker-and-image-tooltip_01.js]
 [browser_rules_colorpicker-and-image-tooltip_02.js]
 [browser_rules_colorpicker-appears-on-swatch-click.js]
 [browser_rules_colorpicker-commit-on-ENTER.js]
 [browser_rules_colorpicker-edit-gradient.js]
 [browser_rules_colorpicker-hides-on-tooltip.js]
 [browser_rules_colorpicker-multiple-changes.js]
 [browser_rules_colorpicker-release-outside-frame.js]
--- a/devtools/client/inspector/rules/test/browser_rules_authored.js
+++ b/devtools/client/inspector/rules/test/browser_rules_authored.js
@@ -1,35 +1,29 @@
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 // Test for as-authored styles.
 
-add_task(function*() {
-  yield basicTest();
-  yield overrideTest();
-  yield colorEditingTest();
-});
-
 function* createTestContent(style) {
   let content = `<style type="text/css">
       ${style}
       </style>
       <div id="testid" class="testclass">Styled Node</div>`;
   yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(content));
 
   let {inspector, view} = yield openRuleView();
   yield selectNode("#testid", inspector);
   return view;
 }
 
-function* basicTest() {
+add_task(function* () {
   let view = yield createTestContent("#testid {" +
                                      // Invalid property.
                                      "  something: random;" +
                                      // Invalid value.
                                      "  color: orang;" +
                                      // Override.
                                      "  background-color: blue;" +
                                      "  background-color: #f0c;" +
@@ -47,84 +41,9 @@ function* basicTest() {
   let rule = elementStyle.rules[1];
 
   for (let i = 0; i < expected.length; ++i) {
     let prop = rule.textProps[i];
     is(prop.name, expected[i].name, "test name for prop " + i);
     is(prop.overridden, expected[i].overridden,
        "test overridden for prop " + i);
   }
-}
-
-function* overrideTest() {
-  let gradientText1 = "(orange, blue);";
-  let gradientText2 = "(pink, teal);";
-
-  let view =
-      yield createTestContent("#testid {" +
-                              "  background-image: linear-gradient" +
-                              gradientText1 +
-                              "  background-image: -ms-linear-gradient" +
-                              gradientText2 +
-                              "  background-image: linear-gradient" +
-                              gradientText2 +
-                              "} ");
-
-  let elementStyle = view._elementStyle;
-  let rule = elementStyle.rules[1];
-
-  // Initially the last property should be active.
-  for (let i = 0; i < 3; ++i) {
-    let prop = rule.textProps[i];
-    is(prop.name, "background-image", "check the property name");
-    is(prop.overridden, i !== 2, "check overridden for " + i);
-  }
-
-  rule.textProps[2].setEnabled(false);
-  yield rule._applyingModifications;
-
-  // Now the first property should be active.
-  for (let i = 0; i < 3; ++i) {
-    let prop = rule.textProps[i];
-    is(prop.overridden || !prop.enabled, i !== 0,
-       "post-change check overridden for " + i);
-  }
-}
-
-function* colorEditingTest() {
-  let colors = [
-    {name: "hex", text: "#f0c", result: "#0f0"},
-    {name: "rgb", text: "rgb(0,128,250)", result: "rgb(0, 255, 0)"},
-    // Test case preservation.
-    {name: "hex", text: "#F0C", result: "#0F0"},
-  ];
-
-  Services.prefs.setCharPref("devtools.defaultColorUnit", "authored");
-
-  for (let color of colors) {
-    let view = yield createTestContent("#testid {" +
-                                       "  color: " + color.text + ";" +
-                                       "} ");
-
-    let cPicker = view.tooltips.colorPicker;
-    let swatch = getRuleViewProperty(view, "#testid", "color").valueSpan
-        .querySelector(".ruleview-colorswatch");
-    let onShown = cPicker.tooltip.once("shown");
-    swatch.click();
-    yield onShown;
-
-    let testNode = yield getNode("#testid");
-
-    yield simulateColorPickerChange(view, cPicker, [0, 255, 0, 1], {
-      element: testNode,
-      name: "color",
-      value: "rgb(0, 255, 0)"
-    });
-
-    let spectrum = yield cPicker.spectrum;
-    let onHidden = cPicker.tooltip.once("hidden");
-    EventUtils.sendKey("RETURN", spectrum.element.ownerDocument.defaultView);
-    yield onHidden;
-
-    is(getRuleViewPropertyValue(view, "#testid", "color"), color.result,
-       "changing the color preserved the unit for " + color.name);
-  }
-}
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/rules/test/browser_rules_authored_color.js
@@ -0,0 +1,59 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test for as-authored styles.
+
+function* createTestContent(style) {
+  let content = `<style type="text/css">
+      ${style}
+      </style>
+      <div id="testid" class="testclass">Styled Node</div>`;
+  yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(content));
+
+  let {inspector, view} = yield openRuleView();
+  yield selectNode("#testid", inspector);
+  return view;
+}
+
+add_task(function* () {
+  let colors = [
+    {name: "hex", text: "#f0c", result: "#0f0"},
+    {name: "rgb", text: "rgb(0,128,250)", result: "rgb(0, 255, 0)"},
+    // Test case preservation.
+    {name: "hex", text: "#F0C", result: "#0F0"},
+  ];
+
+  Services.prefs.setCharPref("devtools.defaultColorUnit", "authored");
+
+  for (let color of colors) {
+    let view = yield createTestContent("#testid {" +
+                                       "  color: " + color.text + ";" +
+                                       "} ");
+
+    let cPicker = view.tooltips.colorPicker;
+    let swatch = getRuleViewProperty(view, "#testid", "color").valueSpan
+        .querySelector(".ruleview-colorswatch");
+    let onShown = cPicker.tooltip.once("shown");
+    swatch.click();
+    yield onShown;
+
+    let testNode = yield getNode("#testid");
+
+    yield simulateColorPickerChange(view, cPicker, [0, 255, 0, 1], {
+      element: testNode,
+      name: "color",
+      value: "rgb(0, 255, 0)"
+    });
+
+    let spectrum = yield cPicker.spectrum;
+    let onHidden = cPicker.tooltip.once("hidden");
+    EventUtils.sendKey("RETURN", spectrum.element.ownerDocument.defaultView);
+    yield onHidden;
+
+    is(getRuleViewPropertyValue(view, "#testid", "color"), color.result,
+       "changing the color preserved the unit for " + color.name);
+  }
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/rules/test/browser_rules_authored_override.js
@@ -0,0 +1,54 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test for as-authored styles.
+
+function* createTestContent(style) {
+  let content = `<style type="text/css">
+      ${style}
+      </style>
+      <div id="testid" class="testclass">Styled Node</div>`;
+  yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(content));
+
+  let {inspector, view} = yield openRuleView();
+  yield selectNode("#testid", inspector);
+  return view;
+}
+
+add_task(function* () {
+  let gradientText1 = "(orange, blue);";
+  let gradientText2 = "(pink, teal);";
+
+  let view =
+      yield createTestContent("#testid {" +
+                              "  background-image: linear-gradient" +
+                              gradientText1 +
+                              "  background-image: -ms-linear-gradient" +
+                              gradientText2 +
+                              "  background-image: linear-gradient" +
+                              gradientText2 +
+                              "} ");
+
+  let elementStyle = view._elementStyle;
+  let rule = elementStyle.rules[1];
+
+  // Initially the last property should be active.
+  for (let i = 0; i < 3; ++i) {
+    let prop = rule.textProps[i];
+    is(prop.name, "background-image", "check the property name");
+    is(prop.overridden, i !== 2, "check overridden for " + i);
+  }
+
+  rule.textProps[2].setEnabled(false);
+  yield rule._applyingModifications;
+
+  // Now the first property should be active.
+  for (let i = 0; i < 3; ++i) {
+    let prop = rule.textProps[i];
+    is(prop.overridden || !prop.enabled, i !== 0,
+       "post-change check overridden for " + i);
+  }
+});
--- a/devtools/client/markupview/markup-view.js
+++ b/devtools/client/markupview/markup-view.js
@@ -836,24 +836,23 @@ MarkupView.prototype = {
       }
 
       let container = this.getContainer(target);
       if (!container) {
         // Container might not exist if this came from a load event for a node
         // we're not viewing.
         continue;
       }
-      if (type === "attributes" || type === "characterData") {
+      if (type === "attributes" || type === "characterData"
+        || type === "events" || type === "pseudoClassLock") {
         container.update();
       } 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();
       }
     }
 
     this._waitForChildren().then(() => {
       if (this._destroyer) {
         console.warn("Could not fully update after markup mutations, " +
           "the markup-view was destroyed while waiting for children.");
         return;
@@ -2542,17 +2541,16 @@ function ElementEditor(aContainer, aNode
         undoMods.apply();
       });
     }
   });
 
   let tagName = this.node.nodeName.toLowerCase();
   this.tag.textContent = tagName;
   this.closeTag.textContent = tagName;
-  this.eventNode.style.display = this.node.hasEventListeners ? "inline-block" : "none";
 
   this.update();
   this.initialized = true;
 }
 
 ElementEditor.prototype = {
 
   set selected(aValue) {
@@ -2638,16 +2636,20 @@ ElementEditor.prototype = {
         // But not if this is the first time the editor instance has
         // been created.
         if (this.initialized) {
           this.flashAttribute(attr.name);
         }
       }
     }
 
+    // Update the event bubble display
+    this.eventNode.style.display = this.node.hasEventListeners ?
+      "inline-block" : "none";
+
     this.updateTextEditor();
   },
 
   /**
    * Update the inline text editor in case of a single text child node.
    */
   updateTextEditor: function() {
     let node = this.node.singleTextChild;
--- a/devtools/client/markupview/test/browser_markupview_events.js
+++ b/devtools/client/markupview/test/browser_markupview_events.js
@@ -147,11 +147,47 @@ const TEST_DATA = [
           "DOM2"
         ],
         handler: 'function boundClickHandler(event) {\n' +
                  '  alert("Bound event clicked");\n' +
                  '}'
       }
     ]
   },
+  // #noevents tests check that dynamically added events are properly displayed
+  // in the markupview
+  {
+    selector: "#noevents",
+    expected: []
+  },
+  {
+    selector: "#noevents",
+    beforeTest: function* (inspector, testActor) {
+      let nodeMutated = inspector.once("markupmutation");
+      yield testActor.eval("window.wrappedJSObject.addNoeventsClickHandler();");
+      yield nodeMutated;
+    },
+    expected: [
+      {
+        type: "click",
+        filename: TEST_URL + ":106",
+        attributes: [
+          "Bubbling",
+          "DOM2"
+        ],
+        handler: 'function noeventsClickHandler(event) {\n' +
+                 '  alert("noevents has an event listener");\n' +
+                 '}'
+      }
+    ]
+  },
+  {
+    selector: "#noevents",
+    beforeTest: function* (inspector, testActor) {
+      let nodeMutated = inspector.once("markupmutation");
+      yield testActor.eval("window.wrappedJSObject.removeNoeventsClickHandler();");
+      yield nodeMutated;
+    },
+    expected: []
+  },
 ];
 
 add_task(runEventPopupTests);
--- a/devtools/client/markupview/test/doc_markup_events.html
+++ b/devtools/client/markupview/test/doc_markup_events.html
@@ -97,16 +97,30 @@
         boundhe.addEventListener("click", this);
       }
 
       boundHandleEventClick.prototype = {
         handleEvent: function() {
           alert("boundHandleEvent clicked");
         }
       };
+
+      function noeventsClickHandler(event) {
+        alert("noevents has an event listener");
+      };
+
+      function addNoeventsClickHandler() {
+        let noevents = document.getElementById("noevents");
+        noevents.addEventListener("click", noeventsClickHandler);
+      };
+
+      function removeNoeventsClickHandler() {
+        let noevents = document.getElementById("noevents");
+        noevents.removeEventListener("click", noeventsClickHandler);
+      };
     </script>
   </head>
   <body onload="init();">
     <div id="container">
       <div>1</div>
       <div>2</div>
       <div>3</div>
       <div>4</div>
--- a/devtools/client/markupview/test/helper_events_test_runner.js
+++ b/devtools/client/markupview/test/helper_events_test_runner.js
@@ -2,40 +2,64 @@
  * 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/. */
 
 /**
  * Generator function that runs checkEventsForNode() for each object in the
  * TEST_DATA array.
  */
 function* runEventPopupTests() {
-  let {inspector} = yield addTab(TEST_URL).then(openInspector);
+  let {inspector, testActor} = yield addTab(TEST_URL).then(openInspector);
 
   yield inspector.markup.expandAll();
 
-  for (let {selector, expected} of TEST_DATA) {
-    yield checkEventsForNode(selector, expected, inspector);
+  for (let test of TEST_DATA) {
+    yield checkEventsForNode(test, inspector, testActor);
   }
 
   // Wait for promises to avoid leaks when running this as a single test.
   // We need to do this because we have opened a bunch of popups and don't them
   // to affect other test runs when they are GCd.
   yield promiseNextTick();
 }
 
 /**
  * Generator function that takes a selector and expected results and returns
  * the event info.
  *
- * @param {String} selector
- *        Selector pointing at the node to be inspected
+ * @param {Object} test
+ *  A test object should contain the following properties:
+ *        - selector {String} a css selector targeting the node to edit
+ *        - expected {Array} array of expected event objects
+ *          - type {String} event type
+ *          - filename {String} filename:line where the evt handler is defined
+ *          - attributes {Array} array of event attributes ({String})
+ *          - handler {String} string representation of the handler
+ *        - beforeTest {Function} (optional) a function to execute on the page
+ *        before running the test
+ * @param {InspectorPanel} inspector The instance of InspectorPanel currently
+ * opened
+ * @param {TestActorFront} testActor
  */
-function* checkEventsForNode(selector, expected, inspector) {
+function* checkEventsForNode(test, inspector, testActor) {
+  let {selector, expected, beforeTest} = test;
   let container = yield getContainerForSelector(selector, inspector);
+
+  if (typeof beforeTest === "function") {
+    yield beforeTest(inspector, testActor);
+  }
+
   let evHolder = container.elt.querySelector(".markupview-events");
+
+  if (expected.length === 0) {
+    // if no event is expected, simply check that the event bubble is hidden
+    is(evHolder.style.display, "none", "event bubble should be hidden");
+    return;
+  }
+
   let tooltip = inspector.markup.tooltip;
 
   yield selectNode(selector, inspector);
 
   // Click button to show tooltip
   info("Clicking evHolder");
   EventUtils.synthesizeMouseAtCenter(evHolder, {}, inspector.markup.doc.defaultView);
   yield tooltip.once("shown");
--- a/devtools/client/performance/test/browser_profiler_tree-abstract-01.js
+++ b/devtools/client/performance/test/browser_profiler_tree-abstract-01.js
@@ -39,21 +39,24 @@ function* spawnTest() {
   is(treeRoot.target.textContent, "root",
     "The root node's text contents are correct.");
   is(treeRoot.container, container,
     "The root node's container is correct.");
 
   // Expand the root and test the child items...
 
   let receivedExpandEvent = treeRoot.once("expand");
+  let receivedInitialFocusEvent = treeRoot.once("focus");
   EventUtils.sendMouseEvent({ type: "mousedown" }, treeRoot.target.querySelector(".arrow"));
 
   let eventItem = yield receivedExpandEvent;
   is(eventItem, treeRoot,
     "The 'expand' event target is correct.");
+
+  yield receivedInitialFocusEvent;
   is(document.commandDispatcher.focusedElement, treeRoot.target,
     "The root node is now focused.");
 
   let fooItem = treeRoot.getChild(0);
   let barItem = treeRoot.getChild(1);
 
   is(container.childNodes.length, 3,
     "The container node should now have three children available.");
--- a/devtools/server/actors/inspector.js
+++ b/devtools/server/actors/inspector.js
@@ -858,16 +858,18 @@ var NodeFront = protocol.FrontClass(Node
           value: change.newValue
         });
       }
     } else if (change.type === "characterData") {
       this._form.shortValue = change.newValue;
       this._form.incompleteValue = change.incompleteValue;
     } else if (change.type === "pseudoClassLock") {
       this._form.pseudoClassLocks = change.pseudoClassLocks;
+    } else if (change.type === "events") {
+      this._form.hasEventListeners = change.hasEventListeners;
     }
   },
 
   // Some accessors to make NodeFront feel more like an nsIDOMNode
 
   get id() {
     return this.getAttribute("id");
   },
@@ -1343,16 +1345,42 @@ var WalkerActor = protocol.ActorClass({
     // managed.
     this.rootNode = this.document();
 
     this.layoutChangeObserver = getLayoutChangesObserver(this.tabActor);
     this._onReflows = this._onReflows.bind(this);
     this.layoutChangeObserver.on("reflows", this._onReflows);
     this._onResize = this._onResize.bind(this);
     this.layoutChangeObserver.on("resize", this._onResize);
+
+    this._onEventListenerChange = this._onEventListenerChange.bind(this);
+    eventListenerService.addListenerChangeListener(this._onEventListenerChange);
+  },
+
+  /**
+   * Callback for eventListenerService.addListenerChangeListener
+   * @param nsISimpleEnumerator changesEnum
+   *    enumerator of nsIEventListenerChange
+   */
+  _onEventListenerChange: function(changesEnum) {
+    let changes = changesEnum.enumerate();
+    while (changes.hasMoreElements()) {
+      let current = changes.getNext().QueryInterface(Ci.nsIEventListenerChange);
+      let target = current.target;
+
+      if (this._refMap.has(target)) {
+        let actor = this._refMap.get(target);
+        let mutation = {
+          type: "events",
+          target: actor.actorID,
+          hasEventListeners: actor._hasEventListeners
+        };
+        this.queueMutation(mutation);
+      }
+    }
   },
 
   // Returns the JSON representation of this object over the wire.
   form: function() {
     return {
       actor: this.actorID,
       root: this.rootNode.form(),
       traits: {
@@ -1409,16 +1437,19 @@ var WalkerActor = protocol.ActorClass({
 
       this.walkerSearch.destroy();
 
       this.layoutChangeObserver.off("reflows", this._onReflows);
       this.layoutChangeObserver.off("resize", this._onResize);
       this.layoutChangeObserver = null;
       releaseLayoutChangesObserver(this.tabActor);
 
+      eventListenerService.removeListenerChangeListener(
+        this._onEventListenerChange);
+
       this.onMutations = null;
 
       this.tabActor = null;
 
       events.emit(this, "destroyed");
     } catch(e) {
       console.error(e);
     }
--- a/devtools/server/actors/script.js
+++ b/devtools/server/actors/script.js
@@ -2719,255 +2719,103 @@ SourceActor.prototype = {
    * called again for each pending breakpoint.
    *
    * @param BreakpointActor actor
    *        The BreakpointActor to be set as a breakpoint handler.
    *
    * @returns A Promise that resolves to the given BreakpointActor.
    */
   _setBreakpoint: function (actor) {
-    let { originalLocation } = actor;
-    let { originalSourceActor, originalLine, originalColumn } = originalLocation;
-
-    return this._setBreakpointAtOriginalLocation(actor, originalLocation)
-               .then((actualLocation) => {
-      if (actualLocation) {
-        return actualLocation;
-      }
-
-      // There were no scripts that matched the given location, so we need to
-      // perform breakpoint sliding. We try to slide the breakpoint by column
-      // first, and if that fails, by line instead.
-      if (!this.isSourceMapped) {
-        if (originalColumn !== undefined) {
-          // To perform breakpoint sliding for column breakpoints, we need to
-          // build a map from column numbers to a list of entry points for each
-          // column, implemented as a sparse array. An entry point is a (script,
-          // offsets) pair, and represents all offsets in that script that are
-          // entry points for the corresponding column.
-          let columnToEntryPointsMap = [];
-
-          // Iterate over all scripts that correspond to this source actor and
-          // line number.
-          let scripts = this.scripts.getScriptsBySourceActor(this, originalLine);
-          for (let script of scripts) {
-            let columnToOffsetMap = script.getAllColumnOffsets()
-                                          .filter(({ lineNumber }) => {
-              return lineNumber === originalLine;
-            })
-
-            // Iterate over each column, and add their list of offsets to the
-            // map from column numbers to entry points by forming a (script,
-            // offsets) pair, where script is the current script, and offsets is
-            // the list of offsets for the current column.
-            for (let { columnNumber: column, offset } of columnToOffsetMap) {
-              let entryPoints = columnToEntryPointsMap[column];
-              if (!entryPoints) {
-                // We dont have a list of entry points for the current column
-                // number yet, so create it and add it to the map.
-                entryPoints = [];
-                columnToEntryPointsMap[column] = entryPoints;
-              }
-              entryPoints.push({ script, offsets: [offset] });
-            }
-          }
-
-          // Now that we have a map from column numbers to a list of entry points
-          // for each column, we can use it to perform breakpoint sliding. Start
-          // at the original column of the breakpoint actor, and keep
-          // incrementing it by one, until either we find a line that has at
-          // least one entry point, or we go past the last column in the map.
-          //
-          // Note that by computing the entire map up front, and implementing it
-          // as a sparse array, we can easily tell when we went past the last
-          // column in the map.
-          let actualColumn = originalColumn + 1;
-          while (actualColumn < columnToEntryPointsMap.length) {
-            let entryPoints = columnToEntryPointsMap[actualColumn];
-            if (entryPoints) {
-              setBreakpointAtEntryPoints(actor, entryPoints);
-              return new OriginalLocation(
-                originalSourceActor,
-                originalLine,
-                actualColumn
-              );
-            }
-            ++actualColumn;
-          }
-
-          return originalLocation;
-        } else {
-          // To perform breakpoint sliding for line breakpoints, we need to
-          // build a map from line numbers to a list of entry points for each
-          // line, implemented as a sparse array. An entry point is a (script,
-          // offsets) pair, and represents all offsets in that script that are
-          // entry points for the corresponding line.
-          let lineToEntryPointsMap = [];
-
-          // Iterate over all scripts that correspond to this source actor.
-          let scripts = this.scripts.getScriptsBySourceActor(this);
-          for (let script of scripts) {
-            // Get all offsets for each line in the current script. This returns
-            // a map from line numbers fo a list of offsets for each line,
-            // implemented as a sparse array.
-            let lineToOffsetsMap = script.getAllOffsets();
-
-            // Iterate over each line, and add their list of offsets to the map
-            // from line numbers to entry points by forming a (script, offsets)
-            // pair, where script is the current script, and offsets is the list
-            // of offsets for the current line.
-            for (let line = 0; line < lineToOffsetsMap.length; ++line) {
-              let offsets = lineToOffsetsMap[line];
-              if (offsets) {
-                let entryPoints = lineToEntryPointsMap[line];
-                if (!entryPoints) {
-                  // We dont have a list of entry points for the current line
-                  // number yet, so create it and add it to the map.
-                  entryPoints = [];
-                  lineToEntryPointsMap[line] = entryPoints;
-                }
-                entryPoints.push({ script, offsets });
-              }
-            }
-          }
-
-          // Now that we have a map from line numbers to a list of entry points
-          // for each line, we can use it to perform breakpoint sliding. Start
-          // at the original line of the breakpoint actor, and keep incrementing
-          // it by one, until either we find a line that has at least one entry
-          // point, or we go past the last line in the map.
-          //
-          // Note that by computing the entire map up front, and implementing it
-          // as a sparse array, we can easily tell when we went past the last
-          // line in the map.
-          let actualLine = originalLine + 1;
-          while (actualLine < lineToEntryPointsMap.length) {
-            let entryPoints = lineToEntryPointsMap[actualLine];
-            if (entryPoints) {
-              setBreakpointAtEntryPoints(actor, entryPoints);
-              break;
-            }
-            ++actualLine;
-          }
-          if (actualLine >= lineToEntryPointsMap.length) {
-            // We went past the last line in the map, so breakpoint sliding
-            // failed. Keep the BreakpointActor in the BreakpointActorMap as a
-            // pending breakpoint, so we can try again whenever a new script is
-            // introduced.
-            return originalLocation;
-          }
-
-          return new OriginalLocation(
-            originalSourceActor,
-            actualLine
-          );
-        }
-      } else {
-        let slideByColumn = (actualColumn) => {
-          return this.sources.getAllGeneratedLocations(new OriginalLocation(
-            this,
-            originalLine,
-            actualColumn
-          )).then((generatedLocations) => {
-            // Because getAllGeneratedLocations will always return the list of
-            // generated locations for the closest column that is greater than
-            // the one we are searching for if no exact match can be found, if
-            // the list of generated locations is empty, we've reached the end
-            // of the original line, and sliding continues by line.
-            if (generatedLocations.length === 0) {
-              return slideByLine(originalLine + 1);
-            }
-
-            // If at least one script has an offset that matches one of the
-            // generated locations in the list, then breakpoint sliding
-            // succeeded.
-            if (this._setBreakpointAtAllGeneratedLocations(actor, generatedLocations)) {
-              return this.threadActor.sources.getOriginalLocation(generatedLocations[0]);
-            }
-
-            // Try the next column in the original source.
-            return slideByColumn(actualColumn + 1);
-          });
-        };
-
-        let slideByLine = (actualLine) => {
-          return this.sources.getAllGeneratedLocations(new OriginalLocation(
-            this,
-            actualLine
-          )).then((generatedLocations) => {
-            // Because getAllGeneratedLocations will always return the list of
-            // generated locations for the closest line that is greater than
-            // the one we are searching for if no exact match can be found, if
-            // the list of generated locations is empty, we've reached the end
-            // of the original source, and breakpoint sliding failed.
-            if (generatedLocations.length === 0) {
-              return originalLocation;
-            }
-
-            // If at least one script has an offset that matches one of the
-            // generated locations in the list, then breakpoint sliding
-            // succeeded.
-            if (this._setBreakpointAtAllGeneratedLocations(actor, generatedLocations)) {
-              return this.threadActor.sources.getOriginalLocation(generatedLocations[0]);
-            }
-
-            // Try the next line in the original source.
-            return slideByLine(actualLine + 1);
-          });
-        };
-
-        if (originalColumn !== undefined) {
-          return slideByColumn(originalColumn + 1);
-        } else {
-          return slideByLine(originalLine + 1);
-        }
-      }
-    }).then((actualLocation) => {
-      // If the actual location on which the BreakpointActor ended up being
-      // set differs from the original line that was requested, both the
-      // BreakpointActor and the BreakpointActorMap need to be updated
-      // accordingly.
-      if (!actualLocation.equals(originalLocation)) {
-        let existingActor = this.breakpointActorMap.getActor(actualLocation);
-        if (existingActor) {
-          actor.onDelete();
-          this.breakpointActorMap.deleteActor(originalLocation);
-          actor = existingActor;
-        } else {
-          this.breakpointActorMap.deleteActor(originalLocation);
-          actor.originalLocation = actualLocation;
-          this.breakpointActorMap.setActor(actualLocation, actor);
-        }
-      }
-
-      return actor;
-    });
-  },
-
-  _setBreakpointAtOriginalLocation: function (actor, originalLocation) {
+    const { originalLocation } = actor;
+    const { originalLine, originalSourceActor } = originalLocation;
+
     if (!this.isSourceMapped) {
       if (!this._setBreakpointAtGeneratedLocation(
         actor,
         GeneratedLocation.fromOriginalLocation(originalLocation)
       )) {
-        return promise.resolve(null);
+        const scripts = this.scripts.getScriptsBySourceActorAndLine(
+          this,
+          originalLine
+        );
+
+        // Never do breakpoint sliding for column breakpoints.
+        // Additionally, never do breakpoint sliding if no scripts
+        // exist on this line.
+        //
+        // Sliding can go horribly wrong if we always try to find the
+        // next line with valid entry points in the entire file.
+        // Scripts may be completely GCed and we never knew they
+        // existed, so we end up sliding through whole functions to
+        // the user's bewilderment.
+        //
+        // We can slide reliably if any scripts exist, however, due
+        // to how scripts are kept alive. A parent Debugger.Script
+        // keeps all of its children alive, so as long as we have a
+        // valid script, we can slide through it and know we won't
+        // slide through any of its child scripts. Additionally, if a
+        // script gets GCed, that means that all parents scripts are
+        // GCed as well, and no scripts will exist on those lines
+        // anymore. We will never slide through a GCed script.
+        if (originalLocation.originalColumn || scripts.length === 0) {
+          return promise.resolve(actor);
+        }
+
+        // Find the script that spans the largest amount of code to
+        // determine the bounds for sliding.
+        const largestScript = scripts.reduce((largestScript, script) => {
+          if (script.lineCount > largestScript.lineCount) {
+            return script;
+          }
+          return largestScript;
+        });
+        const maxLine = largestScript.startLine + largestScript.lineCount - 1;
+
+        let actualLine = originalLine;
+        for (; actualLine <= maxLine; actualLine++) {
+          const loc = new GeneratedLocation(this, actualLine);
+          if (this._setBreakpointAtGeneratedLocation(actor, loc)) {
+            break;
+          }
+        }
+
+        // The above loop should never complete. We only did breakpoint sliding
+        // because we found scripts on the line we started from,
+        // which means there must be valid entry points somewhere
+        // within those scripts.
+        assert(
+          actualLine <= maxLine,
+          "Could not find any entry points to set a breakpoint on, " +
+          "even though I was told a script existed on the line I started " +
+          "the search with."
+        );
+
+        // Update the actor to use the new location (reusing a
+        // previous breakpoint if it already exists on that line).
+        const actualLocation = new OriginalLocation(originalSourceActor, actualLine);
+        const existingActor = this.breakpointActorMap.getActor(actualLocation);
+        this.breakpointActorMap.deleteActor(originalLocation);
+        if (existingActor) {
+          actor.onDelete();
+          actor = existingActor;
+        } else {
+          actor.originalLocation = actualLocation;
+          this.breakpointActorMap.setActor(actualLocation, actor);
+        }
       }
 
-      return promise.resolve(originalLocation);
+      return promise.resolve(actor);
     } else {
-      return this.sources.getAllGeneratedLocations(originalLocation)
-                         .then((generatedLocations) => {
-        if (!this._setBreakpointAtAllGeneratedLocations(
+      return this.sources.getAllGeneratedLocations(originalLocation).then((generatedLocations) => {
+        this._setBreakpointAtAllGeneratedLocations(
           actor,
           generatedLocations
-        )) {
-          return null;
-        }
-
-        return this.threadActor.sources.getOriginalLocation(generatedLocations[0]);
+        );
+
+        return actor;
       });
     }
   },
 
   _setBreakpointAtAllGeneratedLocations: function (actor, generatedLocations) {
     let success = false;
     for (let generatedLocation of generatedLocations) {
       if (this._setBreakpointAtGeneratedLocation(
--- a/devtools/server/actors/utils/TabSources.js
+++ b/devtools/server/actors/utils/TabSources.js
@@ -627,18 +627,18 @@ TabSources.prototype = {
 
   getAllGeneratedLocations: function (originalLocation) {
     let {
       originalSourceActor,
       originalLine,
       originalColumn
     } = originalLocation;
 
-    let source = originalSourceActor.source ||
-                 originalSourceActor.generatedSource;
+    let source = (originalSourceActor.source ||
+                  originalSourceActor.generatedSource);
 
     return this.fetchSourceMap(source).then((map) => {
       if (map) {
         map.computeColumnSpans();
 
         return map.allGeneratedPositionsFor({
           source: originalSourceActor.url,
           line: originalLine,
--- a/devtools/server/tests/mochitest/chrome.ini
+++ b/devtools/server/tests/mochitest/chrome.ini
@@ -64,16 +64,17 @@ skip-if = buildapp == 'mulet'
 [test_inspector_getImageDataFromURL.html]
 skip-if = buildapp == 'mulet'
 [test_inspector_getImageData-wait-for-load.html]
 skip-if = buildapp == 'mulet'
 [test_inspector_getNodeFromActor.html]
 [test_inspector-hide.html]
 [test_inspector-insert.html]
 [test_inspector-mutations-attr.html]
+[test_inspector-mutations-events.html]
 [test_inspector-mutations-childlist.html]
 [test_inspector-mutations-frameload.html]
 [test_inspector-mutations-value.html]
 [test_inspector-pseudoclass-lock.html]
 [test_inspector-release.html]
 [test_inspector-reload.html]
 [test_inspector-remove.html]
 [test_inspector-resize.html]
new file mode 100644
--- /dev/null
+++ b/devtools/server/tests/mochitest/test_inspector-mutations-events.html
@@ -0,0 +1,184 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1157469
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 1157469</title>
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
+  <script type="application/javascript;version=1.8" src="inspector-helpers.js"></script>
+  <script type="application/javascript;version=1.8">
+
+window.onload = function() {
+
+  const Cu = Components.utils;
+  Cu.import("resource://gre/modules/devtools/Loader.jsm");
+  const {InspectorFront} =
+    devtools.require("devtools/server/actors/inspector");
+
+  SimpleTest.waitForExplicitFinish();
+
+  let inspectee = null;
+  let inspector = null;
+  let walker = null;
+  let eventListener1 = function () {};
+  let eventListener2 = function () {};
+  let eventNode1;
+  let eventNode2;
+  let eventFront1;
+  let eventFront2;
+
+  addAsyncTest(function* setup() {
+    info ("Setting up inspector and walker actors.");
+    let url = document.getElementById("inspectorContent").href;
+
+    yield new Promise(resolve => {
+      attachURL(url, function(err, client, tab, doc) {
+        inspectee = doc;
+        inspector = InspectorFront(client, tab);
+        resolve();
+      });
+    });
+
+    walker = yield inspector.getWalker();
+    ok(walker, "getWalker() should return an actor.");
+
+    runNextTest();
+  });
+
+  addAsyncTest(function* setupEventTest() {
+    eventNode1 = inspectee.querySelector("#a")
+    eventNode2 = inspectee.querySelector("#b")
+
+    eventFront1 = yield walker.querySelector(walker.rootNode, "#a");
+    eventFront2 = yield walker.querySelector(walker.rootNode, "#b");
+
+    runNextTest();
+  });
+
+  addAsyncTest(function* testChangeEventListenerOnSingleNode() {
+    checkNodesHaveNoEventListener();
+
+    info("add event listener on a single node");
+    eventNode1.addEventListener("click", eventListener1);
+
+    let mutations = yield waitForMutations();
+    is(mutations.length, 1, "one mutation expected");
+    is(mutations[0].target, eventFront1, "mutation targets eventFront1");
+    is(mutations[0].type, "events", "mutation type is events");
+    is(mutations[0].hasEventListeners, true, "mutation target should have event listeners");
+    is(eventFront1.hasEventListeners, true, "eventFront1 should have event listeners");
+
+    info("remove event listener on a single node");
+    eventNode1.removeEventListener("click", eventListener1);
+
+    mutations = yield waitForMutations();
+    is(mutations.length, 1, "one mutation expected");
+    is(mutations[0].target, eventFront1, "mutation targets eventFront1");
+    is(mutations[0].type, "events", "mutation type is events");
+    is(mutations[0].hasEventListeners, false, "mutation target should have no event listeners");
+    is(eventFront1.hasEventListeners, false, "eventFront1 should have no event listeners");
+
+    info("perform several event listener changes on a single node")
+    eventNode1.addEventListener("click", eventListener1);
+    eventNode1.addEventListener("click", eventListener2);
+    eventNode1.removeEventListener("click", eventListener1);
+    eventNode1.removeEventListener("click", eventListener2);
+
+    mutations = yield waitForMutations();
+    is(mutations.length, 1, "one mutation expected");
+    is(mutations[0].target, eventFront1, "mutation targets eventFront1");
+    is(mutations[0].type, "events", "mutation type is events");
+    is(mutations[0].hasEventListeners, false, "no event listener expected on mutation target");
+    is(eventFront1.hasEventListeners, false, "no event listener expected on node");
+
+    runNextTest();
+  });
+
+  addAsyncTest(function* testChangeEventsOnSeveralNodes() {
+    checkNodesHaveNoEventListener();
+
+    info("add event listeners on both nodes");
+    eventNode1.addEventListener("click", eventListener1);
+    eventNode2.addEventListener("click", eventListener2);
+
+    let mutations = yield waitForMutations();
+    is(mutations.length, 2, "two mutations expected, one for each modified node");
+    // first mutation
+    is(mutations[0].target, eventFront1, "first mutation targets eventFront1");
+    is(mutations[0].type, "events", "mutation type is events");
+    is(mutations[0].hasEventListeners, true, "mutation target should have event listeners");
+    is(eventFront1.hasEventListeners, true, "eventFront1 should have event listeners");
+    // second mutation
+    is(mutations[1].target, eventFront2, "second mutation targets eventFront2");
+    is(mutations[1].type, "events", "mutation type is events");
+    is(mutations[1].hasEventListeners, true, "mutation target should have event listeners");
+    is(eventFront2.hasEventListeners, true, "eventFront1 should have event listeners");
+
+    info("remove event listeners on both nodes");
+    eventNode1.removeEventListener("click", eventListener1);
+    eventNode2.removeEventListener("click", eventListener2);
+
+    mutations = yield waitForMutations();
+    is(mutations.length, 2, "one mutation registered for event listener change");
+    // first mutation
+    is(mutations[0].target, eventFront1, "first mutation targets eventFront1");
+    is(mutations[0].type, "events", "mutation type is events");
+    is(mutations[0].hasEventListeners, false, "mutation target should have no event listeners");
+    is(eventFront1.hasEventListeners, false, "eventFront2 should have no event listeners");
+    // second mutation
+    is(mutations[1].target, eventFront2, "second mutation targets eventFront2");
+    is(mutations[1].type, "events", "mutation type is events");
+    is(mutations[1].hasEventListeners, false, "mutation target should have no event listeners");
+    is(eventFront2.hasEventListeners, false, "eventFront2 should have no event listeners");
+
+    runNextTest();
+  });
+
+  addAsyncTest(function* testRemoveMissingEvent() {
+    checkNodesHaveNoEventListener();
+
+    info("try to remove an event listener not previously added");
+    eventNode1.removeEventListener("click", eventListener1);
+
+    info("set any attribute on the node to trigger a mutation")
+    eventNode1.setAttribute("data-attr", "somevalue");
+
+    let mutations = yield waitForMutations();
+    is(mutations.length, 1, "expect only one mutation");
+    isnot(mutations.type, "events", "mutation type should not be events");
+
+    runNextTest();
+  });
+
+  function checkNodesHaveNoEventListener() {
+    is(eventFront1.hasEventListeners, false, "eventFront1 hasEventListeners should be false");
+    is(eventFront2.hasEventListeners, false, "eventFront2 hasEventListeners should be false");
+  };
+
+  function waitForMutations() {
+    return new Promise(resolve => {
+      walker.once("mutations", mutations => {
+        resolve(mutations);
+      });
+    });
+  }
+
+  runNextTest();
+}
+
+  </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1157469">Mozilla Bug 1157469</a>
+<a id="inspectorContent" target="_blank" href="inspector-traversal-data.html">Test Document</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
--- a/devtools/server/tests/unit/test_breakpoint-01.js
+++ b/devtools/server/tests/unit/test_breakpoint-01.js
@@ -60,14 +60,16 @@ function test_simple_breakpoint()
 
       });
 
       // Continue until the breakpoint is hit.
       gThreadClient.resume();
     });
   });
 
-  Components.utils.evalInSandbox("var line0 = Error().lineNumber;\n" +
-                                 "debugger;\n" +   // line0 + 1
-                                 "var a = 1;\n" +  // line0 + 2
-                                 "var b = 2;\n",   // line0 + 3
-                                 gDebuggee);
+  Cu.evalInSandbox(
+    "var line0 = Error().lineNumber;\n" +
+    "debugger;\n" +   // line0 + 1
+    "var a = 1;\n" +  // line0 + 2
+    "var b = 2;\n",   // line0 + 3
+    gDebuggee
+  );
 }
--- a/devtools/server/tests/unit/test_breakpoint-02.js
+++ b/devtools/server/tests/unit/test_breakpoint-02.js
@@ -52,13 +52,16 @@ function test_breakpoint_running()
       do_check_neq(aResponse.error, "noScript");
 
       do_execute_soon(function() {
         gClient.close(gCallback);
       });
     });
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "debugger;\n" +
-                 "var a = 1;\n" +  // line0 + 2
-                 "var b = 2;\n");  // line0 + 3
+  Cu.evalInSandbox(
+    "var line0 = Error().lineNumber;\n" +
+    "debugger;\n" +
+    "var a = 1;\n" +  // line0 + 2
+    "var b = 2;\n",  // line0 + 3
+    gDebuggee
+  );
 }
--- a/devtools/server/tests/unit/test_breakpoint-03.js
+++ b/devtools/server/tests/unit/test_breakpoint-03.js
@@ -1,13 +1,15 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 /**
- * Check that setting a breakpoint in a line without code will skip forward.
+ * Check that setting a breakpoint on a line without code will skip
+ * forward when we know the script isn't GCed (the debugger is connected,
+ * so it's kept alive).
  */
 
 var gDebuggee;
 var gClient;
 var gThreadClient;
 var gCallback;
 
 function run_test()
@@ -60,19 +62,23 @@ function test_skip_breakpoint()
         // Remove the breakpoint.
         bpClient.remove(function (aResponse) {
           gThreadClient.resume(function () {
             gClient.close(gCallback);
           });
         });
       });
 
-      // Continue until the breakpoint is hit.
       gThreadClient.resume();
     });
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "debugger;\n" +      // line0 + 1
-                 "var a = 1;\n" +     // line0 + 2
-                 "// A comment.\n" +  // line0 + 3
-                 "var b = 2;");     // line0 + 4
+  // Use `evalInSandbox` to make the debugger treat it as normal
+  // globally-scoped code, where breakpoint sliding rules apply.
+  Cu.evalInSandbox(
+    "var line0 = Error().lineNumber;\n" +
+    "debugger;\n" +      // line0 + 1
+    "var a = 1;\n" +     // line0 + 2
+    "// A comment.\n" +  // line0 + 3
+    "var b = 2;",        // line0 + 4
+    gDebuggee
+  );
 }
--- a/devtools/server/tests/unit/test_breakpoint-04.js
+++ b/devtools/server/tests/unit/test_breakpoint-04.js
@@ -62,16 +62,19 @@ function test_child_breakpoint()
       });
 
       // Continue until the breakpoint is hit.
       gThreadClient.resume();
     });
 
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo() {\n" + // line0 + 1
-                 "  this.a = 1;\n" +    // line0 + 2
-                 "  this.b = 2;\n" +    // line0 + 3
-                 "}\n" +                // line0 + 4
-                 "debugger;\n" +        // line0 + 5
-                 "foo();\n");           // line0 + 6
+  Cu.evalInSandbox(
+    "var line0 = Error().lineNumber;\n" +
+    "function foo() {\n" + // line0 + 1
+    "  this.a = 1;\n" +    // line0 + 2
+    "  this.b = 2;\n" +    // line0 + 3
+    "}\n" +                // line0 + 4
+    "debugger;\n" +        // line0 + 5
+    "foo();\n",            // line0 + 6
+    gDebuggee
+  );
 }
--- a/devtools/server/tests/unit/test_breakpoint-05.js
+++ b/devtools/server/tests/unit/test_breakpoint-05.js
@@ -1,13 +1,13 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 /**
- * Check that setting a breakpoint in a line without code in a child scrip
+ * Check that setting a breakpoint in a line without code in a child script
  * will skip forward.
  */
 
 var gDebuggee;
 var gClient;
 var gThreadClient;
 var gCallback;
 
@@ -63,17 +63,20 @@ function test_child_skip_breakpoint()
         });
       });
 
       // Continue until the breakpoint is hit.
       gThreadClient.resume();
     });
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo() {\n" + // line0 + 1
-                 "  this.a = 1;\n" +    // line0 + 2
-                 "  // A comment.\n" +  // line0 + 3
-                 "  this.b = 2;\n" +    // line0 + 4
-                 "}\n" +                // line0 + 5
-                 "debugger;\n" +        // line0 + 6
-                 "foo();\n");           // line0 + 7
+  Cu.evalInSandbox(
+    "var line0 = Error().lineNumber;\n" +
+    "function foo() {\n" + // line0 + 1
+    "  this.a = 1;\n" +    // line0 + 2
+    "  // A comment.\n" +  // line0 + 3
+    "  this.b = 2;\n" +    // line0 + 4
+    "}\n" +                // line0 + 5
+    "debugger;\n" +        // line0 + 6
+    "foo();\n",            // line0 + 7
+    gDebuggee
+  );
 }
--- a/devtools/server/tests/unit/test_breakpoint-06.js
+++ b/devtools/server/tests/unit/test_breakpoint-06.js
@@ -64,23 +64,26 @@ function test_nested_breakpoint()
       });
 
       // Continue until the breakpoint is hit.
       gThreadClient.resume();
     });
 
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo() {\n" +     // line0 + 1
-                 "  function bar() {\n" +   // line0 + 2
-                 "    function baz() {\n" + // line0 + 3
-                 "      this.a = 1;\n" +    // line0 + 4
-                 "      // A comment.\n" +  // line0 + 5
-                 "      this.b = 2;\n" +    // line0 + 6
-                 "    }\n" +                // line0 + 7
-                 "    baz();\n" +           // line0 + 8
-                 "  }\n" +                  // line0 + 9
-                 "  bar();\n" +             // line0 + 10
-                 "}\n" +                    // line0 + 11
-                 "debugger;\n" +            // line0 + 12
-                 "foo();\n");               // line0 + 13
+  Cu.evalInSandbox(
+    "var line0 = Error().lineNumber;\n" +
+    "function foo() {\n" +     // line0 + 1
+    "  function bar() {\n" +   // line0 + 2
+    "    function baz() {\n" + // line0 + 3
+    "      this.a = 1;\n" +    // line0 + 4
+    "      // A comment.\n" +  // line0 + 5
+    "      this.b = 2;\n" +    // line0 + 6
+    "    }\n" +                // line0 + 7
+    "    baz();\n" +           // line0 + 8
+    "  }\n" +                  // line0 + 9
+    "  bar();\n" +             // line0 + 10
+    "}\n" +                    // line0 + 11
+    "debugger;\n" +            // line0 + 12
+    "foo();\n",               // line0 + 13
+    gDebuggee
+  )
 }
--- a/devtools/server/tests/unit/test_breakpoint-07.js
+++ b/devtools/server/tests/unit/test_breakpoint-07.js
@@ -63,20 +63,23 @@ function test_second_child_skip_breakpoi
         });
       });
 
       // Continue until the breakpoint is hit.
       gThreadClient.resume();
     });
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo() {\n" + // line0 + 1
-                 "  bar();\n" +         // line0 + 2
-                 "}\n" +                // line0 + 3
-                 "function bar() {\n" + // line0 + 4
-                 "  this.a = 1;\n" +    // line0 + 5
-                 "  // A comment.\n" +  // line0 + 6
-                 "  this.b = 2;\n" +    // line0 + 7
-                 "}\n" +                // line0 + 8
-                 "debugger;\n" +        // line0 + 9
-                 "foo();\n");           // line0 + 10
+  Cu.evalInSandbox(
+    "var line0 = Error().lineNumber;\n" +
+    "function foo() {\n" + // line0 + 1
+    "  bar();\n" +         // line0 + 2
+    "}\n" +                // line0 + 3
+    "function bar() {\n" + // line0 + 4
+    "  this.a = 1;\n" +    // line0 + 5
+    "  // A comment.\n" +  // line0 + 6
+    "  this.b = 2;\n" +    // line0 + 7
+    "}\n" +                // line0 + 8
+    "debugger;\n" +        // line0 + 9
+    "foo();\n",           // line0 + 10
+    gDebuggee
+  )
 }
--- a/devtools/server/tests/unit/test_breakpoint-08.js
+++ b/devtools/server/tests/unit/test_breakpoint-08.js
@@ -43,18 +43,17 @@ function test_child_skip_breakpoint()
       });
     });
 
     function runWithBreakpoint(aPacket) {
       let source = gThreadClient.source(aPacket.source);
       let location = { line: gDebuggee.line0 + 3 };
 
       source.setBreakpoint(location, function (aResponse, bpClient) {
-        // Check that the breakpoint has properly skipped forward one
-        // line.
+        // Check that the breakpoint has properly skipped forward one line.
         do_check_eq(aResponse.actualLocation.source.actor, source.actor);
         do_check_eq(aResponse.actualLocation.line, location.line + 1);
 
         gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
           // Check the return value.
           do_check_eq(aPacket.type, "paused");
           do_check_eq(aPacket.frame.where.source.actor, source.actor);
           do_check_eq(aPacket.frame.where.line, location.line + 1);
@@ -73,18 +72,25 @@ function test_child_skip_breakpoint()
         });
 
         // Continue until the breakpoint is hit.
         gThreadClient.resume();
       });
     }
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo() {\n" + // line0 + 1
-                 "  this.a = 1;\n" +    // line0 + 2
-                 "  // A comment.\n" +  // line0 + 3
-                 "  this.b = 2;\n" +    // line0 + 3
-                 "}\n");                // line0 + 4
-  gDebuggee.eval("var line1 = Error().lineNumber;\n" +
-                 "debugger;\n" +        // line1 + 1
-                 "foo();\n");           // line1 + 2
+  Cu.evalInSandbox("var line0 = Error().lineNumber;\n" +
+                   "function foo() {\n" + // line0 + 1
+                   "  this.a = 1;\n" +    // line0 + 2
+                   "  // A comment.\n" +  // line0 + 3
+                   "  this.b = 2;\n" +    // line0 + 4
+                   "}\n",                 // line0 + 5
+                   gDebuggee,
+                   "1.7",
+                   "script1.js");
+
+  Cu.evalInSandbox("var line1 = Error().lineNumber;\n" +
+                   "debugger;\n" +        // line1 + 1
+                   "foo();\n",           // line1 + 2
+                   gDebuggee,
+                   "1.7",
+                   "script2.js");
 }
--- a/devtools/server/tests/unit/test_breakpoint-09.js
+++ b/devtools/server/tests/unit/test_breakpoint-09.js
@@ -66,22 +66,23 @@ function test_remove_breakpoint()
       });
       // Continue until the breakpoint is hit.
       gThreadClient.resume();
 
     });
 
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo(stop) {\n" + // line0 + 1
-                 "  this.a = 1;\n" +        // line0 + 2
-                 "  if (stop) return;\n" +  // line0 + 3
-                 "  delete this.a;\n" +     // line0 + 4
-                 "  foo(true);\n" +         // line0 + 5
-                 "}\n" +                    // line0 + 6
-                 "debugger;\n" +            // line1 + 7
-                 "foo();\n");               // line1 + 8
+  Cu.evalInSandbox("var line0 = Error().lineNumber;\n" +
+                   "function foo(stop) {\n" + // line0 + 1
+                   "  this.a = 1;\n" +        // line0 + 2
+                   "  if (stop) return;\n" +  // line0 + 3
+                   "  delete this.a;\n" +     // line0 + 4
+                   "  foo(true);\n" +         // line0 + 5
+                   "}\n" +                    // line0 + 6
+                   "debugger;\n" +            // line1 + 7
+                   "foo();\n",                // line1 + 8
+                   gDebuggee);
   if (!done) {
     do_check_true(false);
   }
   gClient.close(gCallback);
 }
--- a/devtools/server/tests/unit/test_breakpoint-10.js
+++ b/devtools/server/tests/unit/test_breakpoint-10.js
@@ -74,15 +74,16 @@ function test_child_breakpoint()
       // Continue until the breakpoint is hit.
       gThreadClient.resume();
 
     });
 
   });
 
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "debugger;\n" +                      // line0 + 1
-                 "var a, i = 0;\n" +                  // line0 + 2
-                 "for (i = 1; i <= 2; i++) {\n" +     // line0 + 3
-                 "  a = i;\n" +                       // line0 + 4
-                 "}\n");                              // line0 + 5
+  Cu.evalInSandbox("var line0 = Error().lineNumber;\n" +
+                   "debugger;\n" +                      // line0 + 1
+                   "var a, i = 0;\n" +                  // line0 + 2
+                   "for (i = 1; i <= 2; i++) {\n" +     // line0 + 3
+                   "  a = i;\n" +                       // line0 + 4
+                   "}\n",                               // line0 + 5
+                   gDebuggee);
 }
--- a/devtools/server/tests/unit/test_breakpoint-11.js
+++ b/devtools/server/tests/unit/test_breakpoint-11.js
@@ -75,13 +75,14 @@ function test_child_breakpoint()
       // Continue until the breakpoint is hit.
       gThreadClient.resume();
 
     });
 
   });
 
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "debugger;\n" +                      // line0 + 1
-                 "var a = { b: 1, f: function() { return 2; } };\n" + // line0+2
-                 "var res = a.f();\n");               // line0 + 3
+  Cu.evalInSandbox("var line0 = Error().lineNumber;\n" +
+                   "debugger;\n" +                      // line0 + 1
+                   "var a = { b: 1, f: function() { return 2; } };\n" + // line0+2
+                   "var res = a.f();\n",               // line0 + 3
+                   gDebuggee);
 }
--- a/devtools/server/tests/unit/test_breakpoint-12.js
+++ b/devtools/server/tests/unit/test_breakpoint-12.js
@@ -50,24 +50,25 @@ function test_child_skip_breakpoint()
       gBpActor = aResponse.actor;
 
       // Set more breakpoints at the same location.
       set_breakpoints(source, location);
     });
 
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo() {\n" + // line0 + 1
-                 "  this.a = 1;\n" +    // line0 + 2
-                 "  // A comment.\n" +  // line0 + 3
-                 "  this.b = 2;\n" +    // line0 + 4
-                 "}\n" +                // line0 + 5
-                 "debugger;\n" +        // line0 + 6
-                 "foo();\n");           // line0 + 7
+  Cu.evalInSandbox("var line0 = Error().lineNumber;\n" +
+                   "function foo() {\n" + // line0 + 1
+                   "  this.a = 1;\n" +    // line0 + 2
+                   "  // A comment.\n" +  // line0 + 3
+                   "  this.b = 2;\n" +    // line0 + 4
+                   "}\n" +                // line0 + 5
+                   "debugger;\n" +        // line0 + 6
+                   "foo();\n",            // line0 + 7
+                   gDebuggee);
 }
 
 // Set many breakpoints at the same location.
 function set_breakpoints(source, location) {
   do_check_neq(gCount, NUM_BREAKPOINTS);
   source.setBreakpoint(location, function (aResponse, bpClient) {
     // Check that the breakpoint has properly skipped forward one line.
     do_check_eq(aResponse.actualLocation.source.actor, source.actor);
--- a/devtools/server/tests/unit/test_breakpoint-13.js
+++ b/devtools/server/tests/unit/test_breakpoint-13.js
@@ -99,17 +99,18 @@ function test_simple_breakpoint()
         // Step into the function call.
         gThreadClient.stepIn();
       });
       // Step into the next line with the function call.
       gThreadClient.stepIn();
     });
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo() {\n" + // line0 + 1
-                 "  this.a = 1;\n" +    // line0 + 2 <-- Breakpoint is set here.
-                 "}\n" +                // line0 + 3
-                 "debugger;\n" +        // line0 + 4
-                 "foo();\n" +           // line0 + 5
-                 "debugger;\n" +        // line0 + 6
-                 "var b = 2;\n");       // line0 + 7
+  Cu.evalInSandbox("var line0 = Error().lineNumber;\n" +
+                   "function foo() {\n" + // line0 + 1
+                   "  this.a = 1;\n" +    // line0 + 2 <-- Breakpoint is set here.
+                   "}\n" +                // line0 + 3
+                   "debugger;\n" +        // line0 + 4
+                   "foo();\n" +           // line0 + 5
+                   "debugger;\n" +        // line0 + 6
+                   "var b = 2;\n",        // line0 + 7
+                   gDebuggee);
 }
--- a/devtools/server/tests/unit/test_breakpoint-14.js
+++ b/devtools/server/tests/unit/test_breakpoint-14.js
@@ -97,17 +97,18 @@ function test_simple_breakpoint()
         // Step over the function call.
         gThreadClient.stepOver();
       });
       // Step over to the next line with the function call.
       gThreadClient.stepOver();
     });
   });
 
-  gDebuggee.eval("var line0 = Error().lineNumber;\n" +
-                 "function foo() {\n" + // line0 + 1
-                 "  this.a = 1;\n" +    // line0 + 2 <-- Breakpoint is set here.
-                 "}\n" +                // line0 + 3
-                 "debugger;\n" +        // line0 + 4
-                 "foo();\n" +           // line0 + 5
-                 "debugger;\n" +        // line0 + 6
-                 "var b = 2;\n");       // line0 + 7
+  Cu.evalInSandbox("var line0 = Error().lineNumber;\n" +
+                   "function foo() {\n" + // line0 + 1
+                   "  this.a = 1;\n" +    // line0 + 2 <-- Breakpoint is set here.
+                   "}\n" +                // line0 + 3
+                   "debugger;\n" +        // line0 + 4
+                   "foo();\n" +           // line0 + 5
+                   "debugger;\n" +        // line0 + 6
+                   "var b = 2;\n",        // line0 + 7
+                   gDebuggee);
 }
deleted file mode 100644
--- a/devtools/server/tests/unit/test_setBreakpoint-on-column-with-no-offests-in-gcd-script.js
+++ /dev/null
@@ -1,57 +0,0 @@
-"use strict";
-
-var SOURCE_URL = getFileUrl("setBreakpoint-on-column-with-no-offsets-in-gcd-script.js");
-
-function run_test() {
-  return Task.spawn(function* () {
-    do_test_pending();
-
-    let global = testGlobal("test");
-    loadSubScript(SOURCE_URL, global);
-    Cu.forceGC();
-
-    DebuggerServer.registerModule("xpcshell-test/testactors");
-    DebuggerServer.init(() => true);
-    DebuggerServer.addTestGlobal(global);
-    let client = new DebuggerClient(DebuggerServer.connectPipe());
-    yield connect(client);
-
-    let tab = yield findTab(client, "test");
-    let [, tabClient] = yield attachTab(client, tab);
-    let [, threadClient] = yield attachThread(tabClient);
-    yield resume(threadClient);
-
-    let source = yield findSource(threadClient, SOURCE_URL);
-    let sourceClient = threadClient.source(source);
-
-    let location = { line: 6, column: 17 };
-    let [packet, breakpointClient] = yield setBreakpoint(sourceClient, location);
-    do_check_true(packet.isPending);
-    do_check_false("actualLocation" in packet);
-
-    executeSoon(function () {
-      reload(tabClient).then(function () {
-        loadSubScript(SOURCE_URL, global);
-      });
-    });
-    packet = yield waitForPaused(threadClient);
-    do_check_eq(packet.type, "paused");
-    let why = packet.why;
-    do_check_eq(why.type, "breakpoint");
-    do_check_eq(why.actors.length, 1);
-    do_check_eq(why.actors[0], breakpointClient.actor);
-    let frame = packet.frame;
-    let where = frame.where;
-    do_check_eq(where.source.actor, source.actor);
-    do_check_eq(where.line, location.line);
-    do_check_eq(where.column, location.column + 7);
-    let variables = frame.environment.bindings.variables;
-    do_check_eq(variables.a.value, 1);
-    do_check_eq(variables.b.value.type, "undefined");
-    do_check_eq(variables.c.value.type, "undefined");
-    yield resume(threadClient);
-
-    yield close(client);
-    do_test_finished();
-  });
-}
deleted file mode 100644
--- a/devtools/server/tests/unit/test_setBreakpoint-on-column-with-no-offsets-at-end-of-script.js
+++ /dev/null
@@ -1,55 +0,0 @@
-"use strict";
-
-var SOURCE_URL = getFileUrl("setBreakpoint-on-column-with-no-offsets-at-end-of-script.js");
-
-function run_test() {
-  return Task.spawn(function* () {
-    do_test_pending();
-
-    DebuggerServer.registerModule("xpcshell-test/testactors");
-    DebuggerServer.init(() => true);
-
-    let global = createTestGlobal("test");
-    DebuggerServer.addTestGlobal(global);
-
-    let client = new DebuggerClient(DebuggerServer.connectPipe());
-    yield connect(client);
-
-    let { tabs } = yield listTabs(client);
-    let tab = findTab(tabs, "test");
-    let [, tabClient] = yield attachTab(client, tab);
-    let [, threadClient] = yield attachThread(tabClient);
-    yield resume(threadClient);
-
-    let promise = waitForNewSource(threadClient, SOURCE_URL);
-    loadSubScript(SOURCE_URL, global);
-    let { source } = yield promise;
-    let sourceClient = threadClient.source(source);
-
-    let location = { line: 4, column: 38 };
-    let [packet, breakpointClient] = yield setBreakpoint(sourceClient, location);
-    do_check_false(packet.isPending);
-    do_check_true("actualLocation" in packet);
-    let actualLocation = packet.actualLocation;
-    do_check_eq(actualLocation.line, 4);
-    do_check_eq(actualLocation.column, 41);
-
-    packet = yield executeOnNextTickAndWaitForPause(function () {
-      Cu.evalInSandbox("f()", global);
-    }, client);
-    do_check_eq(packet.type, "paused");
-    let why = packet.why;
-    do_check_eq(why.type, "breakpoint");
-    do_check_eq(why.actors.length, 1);
-    do_check_eq(why.actors[0], breakpointClient.actor);
-    let where = packet.frame.where;
-    do_check_eq(where.source.actor, source.actor);
-    do_check_eq(where.line, actualLocation.line);
-    do_check_eq(where.column, actualLocation.column);
-
-    yield resume(threadClient);
-    yield close(client);
-
-    do_test_finished();
-  });
-}
deleted file mode 100644
--- a/devtools/server/tests/unit/test_setBreakpoint-on-column-with-no-offsets-in-gcd-script.js
+++ /dev/null
@@ -1,57 +0,0 @@
-"use strict";
-
-var SOURCE_URL = getFileUrl("setBreakpoint-on-column-with-no-offsets-in-gcd-script.js");
-
-function run_test() {
-  return Task.spawn(function* () {
-    do_test_pending();
-
-    let global = testGlobal("test");
-    loadSubScript(SOURCE_URL, global);
-    Cu.forceGC(); Cu.forceGC(); Cu.forceGC();
-
-    DebuggerServer.registerModule("xpcshell-test/testactors");
-    DebuggerServer.init(() => true);
-    DebuggerServer.addTestGlobal(global);
-    let client = new DebuggerClient(DebuggerServer.connectPipe());
-    yield connect(client);
-
-    let { tabs } = yield listTabs(client);
-    let tab = findTab(tabs, "test");
-    let [, tabClient] = yield attachTab(client, tab);
-    let [, threadClient] = yield attachThread(tabClient);
-    yield resume(threadClient);
-
-    let { sources } = yield getSources(threadClient);
-    let source = findSource(sources, SOURCE_URL);
-    let sourceClient = threadClient.source(source);
-
-    let location = { line: 6, column: 17 };
-    let [packet, breakpointClient] = yield setBreakpoint(sourceClient, location);
-    do_check_true(packet.isPending);
-    do_check_false("actualLocation" in packet);
-
-    packet = yield executeOnNextTickAndWaitForPause(function () {
-      reload(tabClient).then(function () {
-        loadSubScript(SOURCE_URL, global);
-      });
-    }, client);
-    do_check_eq(packet.type, "paused");
-    let why = packet.why;
-    do_check_eq(why.type, "breakpoint");
-    do_check_eq(why.actors.length, 1);
-    do_check_eq(why.actors[0], breakpointClient.actor);
-    let frame = packet.frame;
-    let where = frame.where;
-    do_check_eq(where.source.actor, source.actor);
-    do_check_eq(where.line, location.line);
-    do_check_eq(where.column, 28);
-    let variables = frame.environment.bindings.variables;
-    do_check_eq(variables.a.value, 1);
-    do_check_eq(variables.c.value.type, "undefined");
-    yield resume(threadClient);
-
-    yield close(client);
-    do_test_finished();
-  });
-}
deleted file mode 100644
--- a/devtools/server/tests/unit/test_setBreakpoint-on-column-with-no-offsets.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-
-var SOURCE_URL = getFileUrl("setBreakpoint-on-column-with-no-offsets.js");
-
-function run_test() {
-  return Task.spawn(function* () {
-    do_test_pending();
-
-    DebuggerServer.registerModule("xpcshell-test/testactors");
-    DebuggerServer.init(() => true);
-
-    let global = createTestGlobal("test");
-    DebuggerServer.addTestGlobal(global);
-
-    let client = new DebuggerClient(DebuggerServer.connectPipe());
-    yield connect(client);
-
-    let { tabs } = yield listTabs(client);
-    let tab = findTab(tabs, "test");
-    let [, tabClient] = yield attachTab(client, tab);
-    let [, threadClient] = yield attachThread(tabClient);
-    yield resume(threadClient);
-
-    let promise = waitForNewSource(threadClient, SOURCE_URL);
-    loadSubScript(SOURCE_URL, global);
-    let { source } = yield promise;
-    let sourceClient = threadClient.source(source);
-
-    let location = { line: 4, column: 17 };
-    let [packet, breakpointClient] = yield setBreakpoint(sourceClient, location);
-    do_check_false(packet.isPending);
-    do_check_true("actualLocation" in packet);
-    let actualLocation = packet.actualLocation;
-    do_check_eq(actualLocation.line, 4);
-    do_check_eq(actualLocation.column, 28);
-
-    packet = yield executeOnNextTickAndWaitForPause(function () {
-      Cu.evalInSandbox("f()", global);
-    }, client);
-    do_check_eq(packet.type, "paused");
-    let why = packet.why;
-    do_check_eq(why.type, "breakpoint");
-    do_check_eq(why.actors.length, 1);
-    do_check_eq(why.actors[0], breakpointClient.actor);
-    let frame = packet.frame;
-    let where = frame.where;
-    do_check_eq(where.source.actor, source.actor);
-    do_check_eq(where.line, actualLocation.line);
-    do_check_eq(where.column, actualLocation.column);
-    let variables = frame.environment.bindings.variables;
-    do_check_eq(variables.a.value, 1);
-    do_check_eq(variables.c.value.type, "undefined");
-
-    yield resume(threadClient);
-    yield close(client);
-
-    do_test_finished();
-  });
-}
--- a/devtools/server/tests/unit/test_sourcemaps-03.js
+++ b/devtools/server/tests/unit/test_sourcemaps-03.js
@@ -22,68 +22,56 @@ function run_test()
       test_simple_source_map();
     });
   });
   do_test_pending();
 }
 
 function testBreakpointMapping(aName, aCallback)
 {
-  // Pause so we can set a breakpoint.
-  gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
-    do_check_true(!aPacket.error);
-    do_check_eq(aPacket.why.type, "debuggerStatement");
+  Task.spawn(function*() {
+    let response = yield waitForPause(gThreadClient);
+    do_check_eq(response.why.type, "debuggerStatement");
 
-    getSource(gThreadClient, "http://example.com/www/js/" + aName + ".js").then(source => {
-      source.setBreakpoint({
-        // Setting the breakpoint on an empty line so that it is pushed down one
-        // line and we can check the source mapped actualLocation later.
-        line: 3
-      }, function (aResponse) {
-        do_check_true(!aResponse.error);
+    const source = yield getSource(gThreadClient, "http://example.com/www/js/" + aName + ".js");
+    response = yield setBreakpoint(source, {
+      // Setting the breakpoint on an empty line so that it is pushed down one
+      // line and we can check the source mapped actualLocation later.
+      line: 3
+    });
 
-        // Actual location should come back source mapped still so that
-        // breakpoints are displayed in the UI correctly, etc.
-        do_check_eq(aResponse.actualLocation.line, 4);
-        do_check_eq(aResponse.actualLocation.source.url,
-                    "http://example.com/www/js/" + aName + ".js");
+    // Should not slide breakpoints for sourcemapped sources
+    do_check_true(!response.actualLocation);
+
+    yield setBreakpoint(source, { line: 4 });
 
-        // The eval will cause us to resume, then we get an unsolicited pause
-        // because of our breakpoint, we resume again to finish the eval, and
-        // finally receive our last pause which has the result of the client
-        // evaluation.
-        gThreadClient.eval(null, aName + "()", function (aResponse) {
-          do_check_true(!aResponse.error, "Shouldn't be an error resuming to eval");
-          do_check_eq(aResponse.type, "resumed");
-
-          gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
-            do_check_eq(aPacket.why.type, "breakpoint");
-            // Assert that we paused because of the breakpoint at the correct
-            // location in the code by testing that the value of `ret` is still
-            // undefined.
-            do_check_eq(aPacket.frame.environment.bindings.variables.ret.value.type,
-                        "undefined");
+    // The eval will cause us to resume, then we get an unsolicited pause
+    // because of our breakpoint, we resume again to finish the eval, and
+    // finally receive our last pause which has the result of the client
+    // evaluation.
+    response = yield rdpRequest(gThreadClient, gThreadClient.eval, null, aName + "()");
+    do_check_eq(response.type, "resumed");
 
-            gThreadClient.resume(function (aResponse) {
-              do_check_true(!aResponse.error);
-
-              gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
-                do_check_eq(aPacket.why.type, "clientEvaluated");
-                do_check_eq(aPacket.why.frameFinished.return, aName);
+    response = yield waitForPause(gThreadClient);
+    do_check_eq(response.why.type, "breakpoint");
+    // Assert that we paused because of the breakpoint at the correct
+    // location in the code by testing that the value of `ret` is still
+    // undefined.
+    do_check_eq(response.frame.environment.bindings.variables.ret.value.type,
+                "undefined");
 
-                gThreadClient.resume(function (aResponse) {
-                  do_check_true(!aResponse.error);
-                  aCallback();
-                });
-              });
-            });
-          });
-        });
-      });
-    });
+    response = yield resume(gThreadClient);
+
+    response = yield waitForPause(gThreadClient);
+    do_check_eq(response.why.type, "clientEvaluated");
+    do_check_eq(response.why.frameFinished.return, aName);
+
+    response = yield resume(gThreadClient);
+
+    aCallback();
   });
 
   gDebuggee.eval("(" + function () {
     debugger;
   } + "());");
 }
 
 function test_simple_source_map()
--- a/devtools/server/tests/unit/xpcshell.ini
+++ b/devtools/server/tests/unit/xpcshell.ini
@@ -251,20 +251,17 @@ reason = bug 937197
 [test_xpcshell_debugging.js]
 support-files = xpcshell_debugging_script.js
 [test_memory_footprint.js]
 run-sequentially = measure memory, has to be run solo
 skip-if = os != 'linux' || debug || asan
 reason = bug 1014071
 [test_setBreakpoint-on-column.js]
 [test_setBreakpoint-on-column-in-gcd-script.js]
-[test_setBreakpoint-on-column-with-no-offsets.js]
 [test_setBreakpoint-on-column-with-no-offsets-at-end-of-line.js]
-[test_setBreakpoint-on-column-with-no-offsets-at-end-of-script.js]
-[test_setBreakpoint-on-column-with-no-offsets-in-gcd-script.js]
 [test_setBreakpoint-on-line.js]
 [test_setBreakpoint-on-line-in-gcd-script.js]
 [test_setBreakpoint-on-line-with-multiple-offsets.js]
 [test_setBreakpoint-on-line-with-multiple-statements.js]
 [test_setBreakpoint-on-line-with-no-offsets.js]
 [test_setBreakpoint-on-line-with-no-offsets-at-end-of-script.js]
 [test_setBreakpoint-on-line-with-no-offsets-in-gcd-script.js]
 [test_safe-getter.js]
--- a/services/common/bagheeraclient.js
+++ b/services/common/bagheeraclient.js
@@ -23,17 +23,16 @@ var {classes: Cc, interfaces: Ci, utils:
 #endif
 
 Cu.import("resource://gre/modules/Promise.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Log.jsm");
 Cu.import("resource://services-common/rest.js");
 Cu.import("resource://services-common/utils.js");
 
-
 /**
  * Represents the result of a Bagheera request.
  */
 this.BagheeraClientRequestResult = function BagheeraClientRequestResult() {
   this.transportSuccess = false;
   this.serverSuccess = false;
   this.request = null;
 };
@@ -180,18 +179,17 @@ BagheeraClient.prototype = Object.freeze
     // consist of only low bytes first.
     data = CommonUtils.encodeUTF8(data);
     data = CommonUtils.convertString(data, "uncompressed", "deflate");
     if (options.telemetryCompressed) {
       try {
         let h = Services.telemetry.getHistogramById(options.telemetryCompressed);
         h.add(data.length);
       } catch (ex) {
-        this._log.warn("Unable to record telemetry for compressed payload size: " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Unable to record telemetry for compressed payload size", ex);
       }
     }
 
     // TODO proper header per bug 807134.
     request.setHeader("Content-Type", "application/json+zlib; charset=utf-8");
 
     this._log.info("Request body length: " + data.length);
 
@@ -246,18 +244,17 @@ BagheeraClient.prototype = Object.freeze
 
     return this.baseURI + "1.0/submit/" + namespace + "/" + id;
   },
 
   _onComplete: function _onComplete(request, deferred, result, error) {
     result.request = request;
 
     if (error) {
-      this._log.info("Transport failure on request: " +
-                     CommonUtils.exceptionStr(error));
+      this._log.info("Transport failure on request", error);
       result.transportSuccess = false;
       deferred.resolve(result);
       return;
     }
 
     result.transportSuccess = true;
 
     let response = request.response;
--- a/services/common/hawkclient.js
+++ b/services/common/hawkclient.js
@@ -23,17 +23,16 @@
  * a single remote server.  Therefore, callers who want to interact with
  * multiple HAWK services should instantiate one HawkClient per service.
  */
 
 this.EXPORTED_SYMBOLS = ["HawkClient"];
 
 var {interfaces: Ci, utils: Cu} = Components;
 
-Cu.import("resource://services-common/utils.js");
 Cu.import("resource://services-crypto/utils.js");
 Cu.import("resource://services-common/hawkrequest.js");
 Cu.import("resource://services-common/observers.js");
 Cu.import("resource://gre/modules/Promise.jsm");
 Cu.import("resource://gre/modules/Log.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 
@@ -266,18 +265,17 @@ this.HawkClient.prototype = {
     };
 
     function onComplete(error) {
       try {
         // |this| is the RESTRequest object and we need to ensure _onComplete
         // gets the same one.
         _onComplete.call(this, error);
       } catch (ex) {
-        log.error("Unhandled exception processing response:" +
-                  CommonUtils.exceptionStr(ex));
+        log.error("Unhandled exception processing response", ex);
         deferred.reject(ex);
       }
     }
 
     let extra = {
       now: this.now(),
       localtimeOffsetMsec: this.localtimeOffsetMsec,
     };
--- a/services/common/hawkrequest.js
+++ b/services/common/hawkrequest.js
@@ -163,17 +163,17 @@ this.Intl.prototype = {
   },
 
   readPref: function() {
     this._everRead = true;
     try {
       this._accepted = Services.prefs.getComplexValue(
         "intl.accept_languages", Ci.nsIPrefLocalizedString).data;
     } catch (err) {
-      this._log.error("Error reading intl.accept_languages pref: " + CommonUtils.exceptionStr(err));
+      this._log.error("Error reading intl.accept_languages pref", err);
     }
   },
 
   get accept_languages() {
     if (!this._everRead) {
       this.readPref();
     }
     return this._accepted;
--- a/services/common/modules-testing/bagheeraserver.js
+++ b/services/common/modules-testing/bagheeraserver.js
@@ -7,17 +7,16 @@
 var {utils: Cu} = Components;
 
 this.EXPORTED_SYMBOLS = ["BagheeraServer"];
 
 Cu.import("resource://gre/modules/Log.jsm");
 Cu.import("resource://services-common/utils.js");
 Cu.import("resource://testing-common/httpd.js");
 
-
 /**
  * This is an implementation of the Bagheera server.
  *
  * The purpose of the server is to facilitate testing of the Bagheera
  * client and the Firefox Health report. It is *not* meant to be a
  * production grade server.
  *
  * The Bagheera server is essentially a glorified document store.
@@ -154,18 +153,17 @@ BagheeraServer.prototype = {
                                     path.substr("/1.0/submit/".length));
       } else {
         throw HTTP_404;
       }
     } catch (ex) {
       if (ex instanceof HttpError) {
         this._log.info("HttpError thrown: " + ex.code + " " + ex.description);
       } else {
-        this._log.warn("Exception processing request: " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Exception processing request", ex);
       }
 
       throw ex;
     }
   },
 
   /**
    * Handles requests to /submit/*.
--- a/services/common/modules-testing/storageserver.js
+++ b/services/common/modules-testing/storageserver.js
@@ -568,18 +568,17 @@ StorageServerCollection.prototype = {
           if (record.sortindex) {
             bso.sortindex = parseInt(record.sortindex, 10);
           }
 
         } else {
           failed[record.id] = "no bso configured";
         }
       } catch (ex) {
-        this._log.info("Exception when processing BSO: " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.info("Exception when processing BSO", ex);
         failed[record.id] = "Exception when processing.";
       }
     }
     return {success: success, failed: failed};
   },
 
   delete: function delete_(options) {
     options = options || {};
@@ -928,17 +927,17 @@ StorageServer.prototype = {
       this.port = this.server.identity.primaryPort;
       this.started = true;
       if (cb) {
         cb();
       }
     } catch (ex) {
       _("==========================================");
       _("Got exception starting Storage HTTP server on port " + this.port);
-      _("Error: " + CommonUtils.exceptionStr(ex));
+      _("Error: " + Log.exceptionStr(ex));
       _("Is there a process already listening on port " + this.port + "?");
       _("==========================================");
       do_throw(ex);
     }
   },
 
   /**
    * Start the server synchronously.
@@ -1283,17 +1282,17 @@ StorageServer.prototype = {
     this.requestCount++;
     let timestamp = new_timestamp();
     try {
       this._handleDefault(handler, req, resp, timestamp);
     } catch (e) {
       if (e instanceof HttpError) {
         this.respond(req, resp, e.code, e.description, "", {}, timestamp);
       } else {
-        this._log.warn(CommonUtils.exceptionStr(e));
+        this._log.warn("StorageServer: handleDefault caught an error", e);
         throw e;
       }
     }
   },
 
   _handleDefault: function _handleDefault(handler, req, resp, timestamp) {
     let path = req.path;
     if (req.queryString.length) {
@@ -1388,18 +1387,17 @@ StorageServer.prototype = {
     }
 
     // Hand off to the appropriate handler for this path component.
     if (first in this.toplevelHandlers) {
       let handler = this.toplevelHandlers[first];
       try {
         return handler.call(this, handler, req, resp, version, username, rest);
       } catch (ex) {
-        this._log.warn("Got exception during request: " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Got exception during request", ex);
         throw ex;
       }
     }
     this._log.debug("StorageServer: Unknown top-level " + first);
     throw HTTP_404;
   },
 
   /**
--- a/services/common/rest.js
+++ b/services/common/rest.js
@@ -356,17 +356,17 @@ RESTRequest.prototype = {
     // as to what the response might be encoded as.
     channel.contentCharset = this.charset;
 
     // Blast off!
     try {
       channel.asyncOpen(this, null);
     } catch (ex) {
       // asyncOpen can throw in a bunch of cases -- e.g., a forbidden port.
-      this._log.warn("Caught an error in asyncOpen: " + CommonUtils.exceptionStr(ex));
+      this._log.warn("Caught an error in asyncOpen", ex);
       CommonUtils.nextTick(onComplete.bind(this, ex));
     }
     this.status = this.SENT;
     this.delayTimeout();
     return this;
   },
 
   /**
@@ -512,18 +512,17 @@ RESTRequest.prototype = {
       try {
         let str = {};
         let num = this._converterStream.readString(count, str);
         if (num != 0) {
           this.response.body += str.value;
         }
       } catch (ex) {
         this._log.warn("Exception thrown reading " + count + " bytes from " +
-                       "the channel.");
-        this._log.warn(CommonUtils.exceptionStr(ex));
+                       "the channel", ex);
         throw ex;
       }
     } else {
       this.response.charset = null;
 
       if (!this._inputStream) {
         this._inputStream = Cc["@mozilla.org/scriptableinputstream;1"]
                               .createInstance(Ci.nsIScriptableInputStream);
@@ -533,18 +532,17 @@ RESTRequest.prototype = {
 
       this.response.body += this._inputStream.read(count);
     }
 
     try {
       this.onProgress();
     } catch (ex) {
       this._log.warn("Got exception calling onProgress handler, aborting " +
-                     this.method + " " + channel.URI.spec);
-      this._log.debug("Exception: " + CommonUtils.exceptionStr(ex));
+                     this.method + " " + channel.URI.spec, ex);
       this.abort();
 
       if (!this.onComplete) {
         this._log.error("Unexpected error: onComplete not defined in " +
                         "onDataAvailable.");
         this.onProgress = null;
         return;
       }
@@ -601,17 +599,17 @@ RESTRequest.prototype = {
     try {
       if (this.shouldCopyOnRedirect(oldChannel, newChannel, flags)) {
         this._log.trace("Copying headers for safe internal redirect.");
         for (let key in this._headers) {
           newChannel.setRequestHeader(key, this._headers[key], false);
         }
       }
     } catch (ex) {
-      this._log.error("Error copying headers: " + CommonUtils.exceptionStr(ex));
+      this._log.error("Error copying headers", ex);
     }
 
     this.channel = newChannel;
 
     // We let all redirects proceed.
     callback.onRedirectVerifyCallback(Cr.NS_OK);
   }
 };
@@ -637,50 +635,47 @@ RESTResponse.prototype = {
   /**
    * HTTP status code
    */
   get status() {
     let status;
     try {
       status = this.request.channel.responseStatus;
     } catch (ex) {
-      this._log.debug("Caught exception fetching HTTP status code:" +
-                      CommonUtils.exceptionStr(ex));
+      this._log.debug("Caught exception fetching HTTP status code", ex);
       return null;
     }
     Object.defineProperty(this, "status", {value: status});
     return status;
   },
 
   /**
    * HTTP status text
    */
   get statusText() {
     let statusText;
     try {
       statusText = this.request.channel.responseStatusText;
     } catch (ex) {
-      this._log.debug("Caught exception fetching HTTP status text:" +
-                      CommonUtils.exceptionStr(ex));
+      this._log.debug("Caught exception fetching HTTP status text", ex);
       return null;
     }
     Object.defineProperty(this, "statusText", {value: statusText});
     return statusText;
   },
 
   /**
    * Boolean flag that indicates whether the HTTP status code is 2xx or not.
    */
   get success() {
     let success;
     try {
       success = this.request.channel.requestSucceeded;
     } catch (ex) {
-      this._log.debug("Caught exception fetching HTTP success flag:" +
-                      CommonUtils.exceptionStr(ex));
+      this._log.debug("Caught exception fetching HTTP success flag", ex);
       return null;
     }
     Object.defineProperty(this, "success", {value: success});
     return success;
   },
 
   /**
    * Object containing HTTP headers (keyed as lower case)
@@ -689,18 +684,17 @@ RESTResponse.prototype = {
     let headers = {};
     try {
       this._log.trace("Processing response headers.");
       let channel = this.request.channel.QueryInterface(Ci.nsIHttpChannel);
       channel.visitResponseHeaders(function (header, value) {
         headers[header.toLowerCase()] = value;
       });
     } catch (ex) {
-      this._log.debug("Caught exception processing response headers:" +
-                      CommonUtils.exceptionStr(ex));
+      this._log.debug("Caught exception processing response headers", ex);
       return null;
     }
 
     Object.defineProperty(this, "headers", {value: headers});
     return headers;
   },
 
   /**
--- a/services/common/tests/unit/head_helpers.js
+++ b/services/common/tests/unit/head_helpers.js
@@ -74,17 +74,17 @@ function httpd_setup (handlers, port=-1)
   for (let path in handlers) {
     server.registerPathHandler(path, handlers[path]);
   }
   try {
     server.start(port);
   } catch (ex) {
     _("==========================================");
     _("Got exception starting HTTP server on port " + port);
-    _("Error: " + CommonUtils.exceptionStr(ex));
+    _("Error: " + Log.exceptionStr(ex));
     _("Is there a process already listening on port " + port + "?");
     _("==========================================");
     do_throw(ex);
   }
 
   // Set the base URI for convenience.
   let i = server.identity;
   server.baseURI = i.primaryScheme + "://" + i.primaryHost + ":" + i.primaryPort;
deleted file mode 100644
--- a/services/common/tests/unit/test_utils_exceptionStr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-function run_test() {
-  run_next_test();
-}
-
-add_test(function test_exceptionStr_non_exceptions() {
-  do_check_eq(CommonUtils.exceptionStr(null), "null");
-  do_check_eq(CommonUtils.exceptionStr(false), "false");
-  do_check_eq(CommonUtils.exceptionStr(undefined), "undefined");
-  do_check_eq(CommonUtils.exceptionStr(12), "12 No traceback available");
-
-  run_next_test();
-});
--- a/services/common/tests/unit/xpcshell.ini
+++ b/services/common/tests/unit/xpcshell.ini
@@ -14,17 +14,16 @@ support-files =
 
 [test_utils_atob.js]
 [test_utils_convert_string.js]
 [test_utils_dateprefs.js]
 [test_utils_deepCopy.js]
 [test_utils_encodeBase32.js]
 [test_utils_encodeBase64URL.js]
 [test_utils_ensureMillisecondsTimestamp.js]
-[test_utils_exceptionStr.js]
 [test_utils_json.js]
 [test_utils_makeURI.js]
 [test_utils_namedTimer.js]
 [test_utils_sets.js]
 [test_utils_stackTrace.js]
 [test_utils_utf8.js]
 [test_utils_uuid.js]
 
--- a/services/common/tokenserverclient.js
+++ b/services/common/tokenserverclient.js
@@ -11,17 +11,16 @@ this.EXPORTED_SYMBOLS = [
   "TokenServerClientServerError",
 ];
 
 var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Log.jsm");
 Cu.import("resource://services-common/rest.js");
-Cu.import("resource://services-common/utils.js");
 Cu.import("resource://services-common/observers.js");
 
 const PREF_LOG_LEVEL = "services.common.log.logger.tokenserverclient";
 
 /**
  * Represents a TokenServerClient error that occurred on the client.
  *
  * This is the base type for all errors raised by client operations.
@@ -280,28 +279,26 @@ TokenServerClient.prototype = {
         if (!cb) {
           self._log.warn("Callback already called! Did it throw?");
           return;
         }
 
         try {
           cb(error, result);
         } catch (ex) {
-          self._log.warn("Exception when calling user-supplied callback: " +
-                         CommonUtils.exceptionStr(ex));
+          self._log.warn("Exception when calling user-supplied callback", ex);
         }
 
         cb = null;
       }
 
       try {
         client._processTokenResponse(this.response, callCallback);
       } catch (ex) {
-        this._log.warn("Error processing token server response: " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Error processing token server response", ex);
 
         let error = new TokenServerClientError(ex);
         error.response = this.response;
         callCallback(error, null);
       }
     });
   },
 
--- a/services/common/utils.js
+++ b/services/common/utils.js
@@ -65,17 +65,16 @@ this.CommonUtils = {
       if (!b.has(x)) {
         return false;
       }
     }
     return true;
   },
 
   // Import these from Log.jsm for backward compatibility
-  exceptionStr: Log.exceptionStr,
   stackTrace: Log.stackTrace,
 
   /**
    * Encode byte string as base64URL (RFC 4648).
    *
    * @param bytes
    *        (string) Raw byte string to encode.
    * @param pad
@@ -97,17 +96,17 @@ this.CommonUtils = {
    */
   makeURI: function makeURI(URIString) {
     if (!URIString)
       return null;
     try {
       return Services.io.newURI(URIString, null, null);
     } catch (e) {
       let log = Log.repository.getLogger("Common.Utils");
-      log.debug("Could not create URI: " + CommonUtils.exceptionStr(e));
+      log.debug("Could not create URI", e);
       return null;
     }
   },
 
   /**
    * Execute a function on the next event loop tick.
    *
    * @param callback
--- a/services/datareporting/DataReportingService.js
+++ b/services/datareporting/DataReportingService.js
@@ -4,21 +4,20 @@
 
 "use strict";
 
 const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 
 Cu.import("resource://gre/modules/ClientID.jsm");
 Cu.import("resource://gre/modules/Preferences.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://services-common/utils.js");
 Cu.import("resource://gre/modules/Promise.jsm");
-Cu.import("resource://gre/modules/Task.jsm");
 Cu.import("resource://gre/modules/osfile.jsm");
-
+XPCOMUtils.defineLazyModuleGetter(this, "Log",
+                                  "resource://gre/modules/Log.jsm");
 
 const ROOT_BRANCH = "datareporting.";
 const POLICY_BRANCH = ROOT_BRANCH + "policy.";
 const HEALTHREPORT_BRANCH = ROOT_BRANCH + "healthreport.";
 const HEALTHREPORT_LOGGING_BRANCH = HEALTHREPORT_BRANCH + "logging.";
 const DEFAULT_LOAD_DELAY_MSEC = 10 * 1000;
 const DEFAULT_LOAD_DELAY_FIRST_RUN_MSEC = 60 * 1000;
 
@@ -117,17 +116,17 @@ DataReportingService.prototype = Object.
 
           // We can't interact with prefs until after the profile is present.
           let policyPrefs = new Preferences(POLICY_BRANCH);
           this.policy = new DataReportingPolicy(policyPrefs, this._prefs, this);
 
           this._os.addObserver(this, "sessionstore-windows-restored", true);
         } catch (ex) {
           Cu.reportError("Exception when initializing data reporting service: " +
-                         CommonUtils.exceptionStr(ex));
+                         Log.exceptionStr(ex));
         }
         break;
 
       case "sessionstore-windows-restored":
         this._os.removeObserver(this, "sessionstore-windows-restored");
         this._os.addObserver(this, "quit-application", false);
 
         let policy = this.policy;
@@ -210,64 +209,62 @@ DataReportingService.prototype = Object.
       return this._healthReporter;
     }
 
     try {
       this._loadHealthReporter();
     } catch (ex) {
       this._healthReporter = null;
       Cu.reportError("Exception when obtaining health reporter: " +
-                     CommonUtils.exceptionStr(ex));
+                     Log.exceptionStr(ex));
     }
 
     return this._healthReporter;
   },
 
   _loadHealthReporter: function () {
     // This should never happen. It was added to help trace down bug 924307.
     if (!this.policy) {
       throw new Error("this.policy not set.");
     }
 
     let ns = {};
     // Lazy import so application startup isn't adversely affected.
 
-    Cu.import("resource://gre/modules/Task.jsm", ns);
     Cu.import("resource://gre/modules/HealthReport.jsm", ns);
-    Cu.import("resource://gre/modules/Log.jsm", ns);
 
     // How many times will we rewrite this code before rolling it up into a
     // generic module? See also bug 451283.
     const LOGGERS = [
       "Services.DataReporting",
       "Services.HealthReport",
       "Services.Metrics",
       "Services.BagheeraClient",
       "Sqlite.Connection.healthreport",
     ];
 
     let loggingPrefs = new Preferences(HEALTHREPORT_LOGGING_BRANCH);
     if (loggingPrefs.get("consoleEnabled", true)) {
       let level = loggingPrefs.get("consoleLevel", "Warn");
-      let appender = new ns.Log.ConsoleAppender();
-      appender.level = ns.Log.Level[level] || ns.Log.Level.Warn;
+      let appender = new Log.ConsoleAppender();
+      appender.level = Log.Level[level] || Log.Level.Warn;
 
       for (let name of LOGGERS) {
-        let logger = ns.Log.repository.getLogger(name);
+        let logger = Log.repository.getLogger(name);
         logger.addAppender(appender);
       }
     }
 
     if (loggingPrefs.get("dumpEnabled", false)) {
       let level = loggingPrefs.get("dumpLevel", "Debug");
-      let appender = new ns.Log.DumpAppender();
-      appender.level = ns.Log.Level[level] || ns.Log.Level.Debug;
+      let appender = new Log.DumpAppender();
+      appender.level = Log.Level[level] || Log.Level.Debug;
 
       for (let name of LOGGERS) {
-        let logger = ns.Log.repository.getLogger(name);
+        let logger = Log.repository.getLogger(name);
         logger.addAppender(appender);
       }
     }
 
     this._healthReporter = new ns.HealthReporter(HEALTHREPORT_BRANCH, this.policy);
 
     // Wait for initialization to finish so if a shutdown occurs before init
     // has finished we don't adversely affect app startup on next run.
--- a/services/datareporting/policy.jsm
+++ b/services/datareporting/policy.jsm
@@ -738,28 +738,26 @@ this.DataReportingPolicy.prototype = Obj
       return false;
     }
 
     let deferred = Promise.defer();
     deferred.promise.then((function onSuccess() {
       this._recordDataPolicyNotification(this.now(), this.currentPolicyVersion);
       this._userNotifyPromise = null;
     }).bind(this), ((error) => {
-      this._log.warn("Data policy notification presentation failed: " +
-                     CommonUtils.exceptionStr(error));
+      this._log.warn("Data policy notification presentation failed", error);
       this._userNotifyPromise = null;
     }).bind(this));
 
     this._log.info("Requesting display of data policy.");
     let request = new NotifyPolicyRequest(this, deferred);
     try {
       this._listener.onNotifyDataPolicy(request);
     } catch (ex) {
-      this._log.warn("Exception when calling onNotifyDataPolicy: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Exception when calling onNotifyDataPolicy", ex);
     }
 
     this._userNotifyPromise = deferred.promise;
 
     return false;
   },
 
   _recordDataPolicyNotification: function (date, version) {
@@ -811,32 +809,30 @@ this.DataReportingPolicy.prototype = Obj
                                                                   isDelete);
 
     let onSuccess = function onSuccess(result) {
       this._inProgressSubmissionRequest = null;
       this._handleSubmissionResult(result);
     }.bind(this);
 
     let onError = function onError(error) {
-      this._log.error("Error when handling data submission result: " +
-                      CommonUtils.exceptionStr(error));
+      this._log.error("Error when handling data submission result", error);
       this._inProgressSubmissionRequest = null;
       this._handleSubmissionFailure();
     }.bind(this);
 
     let chained = deferred.promise.then(onSuccess, onError);
 
     this._log.info("Requesting data submission. Will expire at " +
                    requestExpiresDate);
     try {
       let promise = this._listener[handler](this._inProgressSubmissionRequest);
       chained = chained.then(() => promise, null);
     } catch (ex) {
-      this._log.warn("Exception when calling " + handler + ": " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Exception when calling " + handler, ex);
       this._inProgressSubmissionRequest = null;
       this._handleSubmissionFailure();
       return;
     }
 
     return chained;
   },
 
--- a/services/healthreport/healthreporter.jsm
+++ b/services/healthreport/healthreporter.jsm
@@ -158,18 +158,17 @@ HealthReporterState.prototype = Object.f
 
       try {
         this._s = yield CommonUtils.readJSON(this._filename);
       } catch (ex if ex instanceof OS.File.Error &&
                ex.becauseNoSuchFile) {
         this._log.warn("Saved state file does not exist.");
         resetObjectState();
       } catch (ex) {
-        this._log.error("Exception when reading state from disk: " +
-                        CommonUtils.exceptionStr(ex));
+        this._log.error("Exception when reading state from disk", ex);
         resetObjectState();
 
         // Don't save in case it goes away on next run.
       }
 
       if (typeof(this._s) != "object") {
         this._log.warn("Read state is not an object. Resetting state.");
         resetObjectState();
@@ -367,18 +366,17 @@ AbstractHealthReporter.prototype = Objec
         if (!this._state._s.removedOutdatedLastpayload) {
           yield this._deleteOldLastPayload();
           this._state._s.removedOutdatedLastpayload = true;
           // Normally we should save this to a file but it directly conflicts with
           // the "application re-upgrade" decision in HealthReporterState::init()
           // which specifically does not save the state to a file.
         }
       } catch (ex) {
-        this._log.error("Error deleting last payload: " +
-                        CommonUtils.exceptionStr(ex));
+        this._log.error("Error deleting last payload", ex);
       }
 
       // As soon as we have could have storage, we need to register cleanup or
       // else bad things happen on shutdown.
       Services.obs.addObserver(this, "quit-application", false);
 
       // The database needs to be shut down by the end of shutdown
       // phase profileBeforeChange.
@@ -465,18 +463,17 @@ AbstractHealthReporter.prototype = Objec
   _deleteOldLastPayload: function () {
     let paths = [this._state._lastPayloadPath, this._state._lastPayloadPath + ".tmp"];
     return Task.spawn(function removeAllFiles () {
       for (let path of paths) {
         try {
           OS.File.remove(path);
         } catch (ex) {
           if (!ex.becauseNoSuchFile) {
-            this._log.error("Exception when removing outdated payload files: " +
-                            CommonUtils.exceptionStr(ex));
+            this._log.error("Exception when removing outdated payload files", ex);
           }
         }
       }
     }.bind(this));
   },
 
   _initializeProviderManager: Task.async(function* _initializeProviderManager() {
     if (this._collector) {
@@ -533,18 +530,17 @@ AbstractHealthReporter.prototype = Objec
       // the timer ID.
       try {
         let timerName = this._branch.replace(/\./g, "-") + "lastDailyCollection";
         let tm = Cc["@mozilla.org/updates/timer-manager;1"]
                    .getService(Ci.nsIUpdateTimerManager);
         tm.registerTimer(timerName, this.collectMeasurements.bind(this),
                          24 * 60 * 60);
       } catch (ex) {
-        this._log.error("Error registering collection timer: " +
-                        CommonUtils.exceptionStr(ex));
+        this._log.error("Error registering collection timer", ex);
       }
     }
 
     // Clean up caches and reduce memory usage.
     this._storage.compact();
   },
 
   // nsIObserver to handle shutdown.
@@ -610,33 +606,31 @@ AbstractHealthReporter.prototype = Objec
         if (this._providerManager) {
           this._log.info("Shutting down provider manager.");
           for (let provider of this._providerManager.providers) {
             try {
               this._log.info("Shutting down provider: " + provider.name);
               this._currentProviderInShutdown = provider.name;
               yield provider.shutdown();
             } catch (ex) {
-              this._log.warn("Error when shutting down provider: " +
-                             CommonUtils.exceptionStr(ex));
+              this._log.warn("Error when shutting down provider", ex);
             }
           }
           this._log.info("Provider manager shut down.");
           this._providerManager = null;
           this._currentProviderInShutdown = null;
           this._onProviderManagerShutdown();
         }
         if (this._storage) {
           this._log.info("Shutting down storage.");
           try {
             yield this._storage.close();
             yield this._onStorageClose();
           } catch (error) {
-            this._log.warn("Error when closing storage: " +
-                           CommonUtils.exceptionStr(error));
+            this._log.warn("Error when closing storage", error);
           }
           this._storage = null;
         }
 
         this._log.warn("Shutdown complete.");
         this._shutdownComplete = true;
       } finally {
         this._deferredShutdown.resolve();
@@ -727,18 +721,18 @@ AbstractHealthReporter.prototype = Objec
    * @param ex
    *        (Error) The error that should be captured.
    */
   _recordError: function (message, ex) {
     let recordMessage = message;
     let logMessage = message;
 
     if (ex) {
-      recordMessage += ": " + CommonUtils.exceptionStr(ex);
-      logMessage += ": " + CommonUtils.exceptionStr(ex);
+      recordMessage += ": " + Log.exceptionStr(ex);
+      logMessage += ": " + Log.exceptionStr(ex);
     }
 
     // Scrub out potentially identifying information from strings that could
     // make the payload.
     let appData = Services.dirsvc.get("UAppData", Ci.nsIFile);
     let profile = Services.dirsvc.get("ProfD", Ci.nsIFile);
 
     let appDataURI = Services.io.newFileURI(appData);
@@ -788,18 +782,17 @@ AbstractHealthReporter.prototype = Objec
 
       try {
         TelemetryStopwatch.start(TELEMETRY_COLLECT_CONSTANT, this);
         yield this._providerManager.collectConstantData(name => this._currentProviderInCollect = name);
         this._currentProviderInCollect = null;
         TelemetryStopwatch.finish(TELEMETRY_COLLECT_CONSTANT, this);
       } catch (ex) {
         TelemetryStopwatch.cancel(TELEMETRY_COLLECT_CONSTANT, this);
-        this._log.warn("Error collecting constant data: " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Error collecting constant data", ex);
       }
 
       // Daily data is collected if it hasn't yet been collected this
       // application session or if it has been more than a day since the
       // last collection. This means that providers could see many calls to
       // collectDailyData per calendar day. However, this collection API
       // makes no guarantees about limits. The alternative would involve
       // recording state. The simpler implementation prevails for now.
@@ -809,18 +802,17 @@ AbstractHealthReporter.prototype = Objec
         try {
           TelemetryStopwatch.start(TELEMETRY_COLLECT_DAILY, this);
           this._lastDailyDate = new Date();
           yield this._providerManager.collectDailyData(name => this._currentProviderInCollect = name);
           this._currentProviderInCollect = null;
           TelemetryStopwatch.finish(TELEMETRY_COLLECT_DAILY, this);
         } catch (ex) {
           TelemetryStopwatch.cancel(TELEMETRY_COLLECT_DAILY, this);
-          this._log.warn("Error collecting daily data from providers: " +
-                         CommonUtils.exceptionStr(ex));
+          this._log.warn("Error collecting daily data from providers", ex);
         }
       }
 
       yield this._providerManager.ensurePullOnlyProvidersUnregistered();
 
       // Flush gathered data to disk. This will incur an fsync. But, if
       // there is ever a time we want to persist data to disk, it's
       // after a massive collection.
@@ -1093,25 +1085,23 @@ AbstractHealthReporter.prototype = Objec
   obtainAppInfo: function () {
     let out = {"_v": this.appInfoVersion};
     try {
       let ai = Services.appinfo;
       for (let [k, v] in Iterator(this.appInfoFields)) {
         out[k] = ai[v];
       }
     } catch (ex) {
-      this._log.warn("Could not obtain Services.appinfo: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Could not obtain Services.appinfo", ex);
     }
 
     try {
       out["updateChannel"] = UpdateUtils.UpdateChannel;
     } catch (ex) {
-      this._log.warn("Could not obtain update channel: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Could not obtain update channel", ex);
     }
 
     return out;
   },
 });
 
 /**
  * HealthReporter and its abstract superclass coordinate collection and
@@ -1317,18 +1307,17 @@ this.HealthReporter.prototype = Object.f
     // Need to capture this before we call the parent else it's always
     // set.
     let inShutdown = this._shutdownRequested;
     let result;
 
     try {
       result = AbstractHealthReporter.prototype._onInitError.call(this, error);
     } catch (ex) {
-      this._log.error("Error when calling _onInitError: " +
-                      CommonUtils.exceptionStr(ex));
+      this._log.error("Error when calling _onInitError", ex);
     }
 
     // This bypasses a lot of the checks in policy, such as respect for
     // backoff. We should arguably not do this. However, reporting
     // startup errors is important. And, they should not occur with much
     // frequency in the wild. So, it shouldn't be too big of a deal.
     if (!inShutdown &&
         this._policy.healthReportUploadEnabled &&
@@ -1357,45 +1346,42 @@ this.HealthReporter.prototype = Object.f
 
       if (!result.transportSuccess) {
         // The built-in provider may not be initialized if this instance failed
         // to initialize fully.
         if (hrProvider && !isDelete) {
           try {
             hrProvider.recordEvent("uploadTransportFailure", date);
           } catch (ex) {
-            this._log.error("Error recording upload transport failure: " +
-                            CommonUtils.exceptionStr(ex));
+            this._log.error("Error recording upload transport failure", ex);
           }
         }
 
         request.onSubmissionFailureSoft("Network transport error.");
         throw new Task.Result(false);
       }
 
       if (!result.serverSuccess) {
         if (hrProvider && !isDelete) {
           try {
             hrProvider.recordEvent("uploadServerFailure", date);
           } catch (ex) {
-            this._log.error("Error recording server failure: " +
-                            CommonUtils.exceptionStr(ex));
+            this._log.error("Error recording server failure", ex);
           }
         }
 
         request.onSubmissionFailureHard("Server failure.");
         throw new Task.Result(false);
       }
 
       if (hrProvider && !isDelete) {
         try {
           hrProvider.recordEvent("uploadSuccess", date);
         } catch (ex) {
-          this._log.error("Error recording upload success: " +
-                          CommonUtils.exceptionStr(ex));
+          this._log.error("Error recording upload success", ex);
         }
       }
 
       if (isDelete) {
         this._log.warn("Marking delete as successful.");
         yield this._state.removeRemoteIDs([result.id]);
       } else {
         this._log.warn("Marking upload as successful.");
@@ -1404,18 +1390,17 @@ this.HealthReporter.prototype = Object.f
 
       request.onSubmissionSuccess(this._now());
 
       throw new Task.Result(true);
     }.bind(this));
   },
 
   _onSubmitDataRequestFailure: function (error) {
-    this._log.error("Error processing request to submit data: " +
-                    CommonUtils.exceptionStr(error));
+    this._log.error("Error processing request to submit data", error);
   },
 
   _formatDate: function (date) {
     // Why, oh, why doesn't JS have a strftime() equivalent?
     return date.toISOString().substr(0, 10);
   },
 
   _uploadData: function (request) {
@@ -1454,18 +1439,17 @@ this.HealthReporter.prototype = Object.f
 
         let hrProvider = this.getProvider("org.mozilla.healthreport");
         if (hrProvider) {
           let event = lastID ? "continuationUploadAttempt"
                              : "firstDocumentUploadAttempt";
           try {
             hrProvider.recordEvent(event, now);
           } catch (ex) {
-            this._log.error("Error when recording upload attempt: " +
-                            CommonUtils.exceptionStr(ex));
+            this._log.error("Error when recording upload attempt", ex);
           }
         }
 
         TelemetryStopwatch.start(TELEMETRY_UPLOAD, this);
         let result;
         try {
           let options = {
             deleteIDs: this._state.remoteIDs.filter((x) => { return x != id; }),
@@ -1475,18 +1459,17 @@ this.HealthReporter.prototype = Object.f
                                            options);
           TelemetryStopwatch.finish(TELEMETRY_UPLOAD, this);
         } catch (ex) {
           TelemetryStopwatch.cancel(TELEMETRY_UPLOAD, this);
           if (hrProvider) {
             try {
               hrProvider.recordEvent("uploadClientFailure", now);
             } catch (ex) {
-              this._log.error("Error when recording client failure: " +
-                              CommonUtils.exceptionStr(ex));
+              this._log.error("Error when recording client failure", ex);
             }
           }
           throw ex;
         }
 
         yield this._onBagheeraResult(request, false, now, result);
       } finally {
         this._uploadInProgress = false;
@@ -1511,15 +1494,14 @@ this.HealthReporter.prototype = Object.f
     let client = new BagheeraClient(this.serverURI);
 
     return Task.spawn(function* doDelete() {
       try {
         let result = yield client.deleteDocument(this.serverNamespace,
                                                  this.lastSubmitID);
         yield this._onBagheeraResult(request, true, this._now(), result);
       } catch (ex) {
-        this._log.error("Error processing request to delete data: " +
-                        CommonUtils.exceptionStr(error));
+        this._log.error("Error processing request to delete data", ex);
       }
     }.bind(this));
   },
 });
 
--- a/services/healthreport/providers.jsm
+++ b/services/healthreport/providers.jsm
@@ -226,18 +226,17 @@ AppInfoProvider.prototype = Object.freez
     }.bind(this);
 
     // Services.appInfo should always be defined for any reasonably behaving
     // Gecko app. If it isn't, we insert a empty string sentinel value.
     let ai;
     try {
       ai = Services.appinfo;
     } catch (ex) {
-      this._log.error("Could not obtain Services.appinfo: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.error("Could not obtain Services.appinfo", ex);
       yield recordEmptyAppInfo();
       return;
     }
 
     if (!ai) {
       this._log.error("Services.appinfo is unavailable.");
       yield recordEmptyAppInfo();
       return;
@@ -309,18 +308,17 @@ AppInfoProvider.prototype = Object.freez
   _populateConstants: function () {
     let m = this.getMeasurement(AppInfoMeasurement.prototype.name,
                                 AppInfoMeasurement.prototype.version);
 
     let ai;
     try {
       ai = Services.appinfo;
     } catch (ex) {
-      this._log.warn("Could not obtain Services.appinfo: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Could not obtain Services.appinfo", ex);
       throw ex;
     }
 
     if (!ai) {
       this._log.warn("Services.appinfo is unavailable.");
       throw ex;
     }
 
@@ -330,32 +328,30 @@ AppInfoProvider.prototype = Object.freez
       } catch (ex) {
         this._log.warn("Error obtaining Services.appinfo." + v);
       }
     }
 
     try {
       yield m.setLastText("updateChannel", UpdateUtils.UpdateChannel);
     } catch (ex) {
-      this._log.warn("Could not obtain update channel: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Could not obtain update channel", ex);
     }
 
     yield m.setLastText("distributionID", this._prefs.get("distribution.id", ""));
     yield m.setLastText("distributionVersion", this._prefs.get("distribution.version", ""));
     yield m.setLastText("hotfixVersion", this._prefs.get("extensions.hotfix.lastVersion", ""));
 
     try {
       let locale = Cc["@mozilla.org/chrome/chrome-registry;1"]
                      .getService(Ci.nsIXULChromeRegistry)
                      .getSelectedLocale("global");
       yield m.setLastText("locale", locale);
     } catch (ex) {
-      this._log.warn("Could not obtain application locale: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Could not obtain application locale", ex);
     }
 
     // FUTURE this should be retrieved periodically or at upload time.
     yield this._recordIsTelemetryEnabled(m);
     yield this._recordIsBlocklistEnabled(m);
     yield this._recordDefaultBrowser(m);
   },
 
@@ -372,29 +368,27 @@ AppInfoProvider.prototype = Object.freez
   },
 
   _recordDefaultBrowser: function (m) {
     let shellService;
     try {
       shellService = Cc["@mozilla.org/browser/shell-service;1"]
                        .getService(Ci.nsIShellService);
     } catch (ex) {
-      this._log.warn("Could not obtain shell service: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Could not obtain shell service", ex);
     }
 
     let isDefault = -1;
 
     if (shellService) {
       try {
         // This uses the same set of flags used by the pref pane.
         isDefault = shellService.isDefaultBrowser(false, true) ? 1 : 0;
       } catch (ex) {
-        this._log.warn("Could not determine if default browser: " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Could not determine if default browser", ex);
       }
     }
 
     return m.setDailyLastNumeric("isDefaultBrowser", isDefault);
   },
 
   collectDailyData: function () {
     return this.storage.enqueueTransaction(function getDaily() {
@@ -501,18 +495,17 @@ SysInfoProvider.prototype = Object.freez
             // above ensures undefined or null doesn't creep in here.
             value = value ? 1 : 0;
             method = "setLastNumeric";
             break;
         }
 
         yield m[method](v, value);
       } catch (ex) {
-        this._log.warn("Error obtaining system info field: " + k + " " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Error obtaining system info field: " + k, ex);
       }
     }
   },
 });
 
 
 /**
  * Holds information about the current/active session.
@@ -903,18 +896,17 @@ AddonsProvider.prototype = Object.freeze
       let pluginsField;
       let gmPluginsField;
       try {
         data = this._createDataStructure(allAddons);
         addonsField = JSON.stringify(data.addons);
         pluginsField = JSON.stringify(data.plugins);
         gmPluginsField = JSON.stringify(data.gmPlugins);
       } catch (ex) {
-        this._log.warn("Exception when populating add-ons data structure: " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Exception when populating add-ons data structure", ex);
         deferred.reject(ex);
         return;
       }
 
       let now = new Date();
       let addons = this.getMeasurement("addons", 2);
       let plugins = this.getMeasurement("plugins", 1);
       let gmPlugins = this.getMeasurement("gm-plugins", 1);
--- a/services/metrics/providermanager.jsm
+++ b/services/metrics/providermanager.jsm
@@ -272,18 +272,17 @@ this.ProviderManager.prototype = Object.
       Task.spawn(function registerPullProviders() {
 
       if (inFlightPromise) {
         this._log.debug("Waiting for in-flight pull-only provider activity " +
                         "to finish before registering.");
         try {
           yield inFlightPromise;
         } catch (ex) {
-          this._log.warn("Error when waiting for existing pull-only promise: " +
-                         CommonUtils.exceptionStr(ex));
+          this._log.warn("Error when waiting for existing pull-only promise", ex);
         }
       }
 
       for (let name in this._pullOnlyProviders) {
         let providerType = this._pullOnlyProviders[name];
         // Short-circuit if we're no longer registering.
         if (this._pullOnlyProvidersState != this.PULL_ONLY_REGISTERING) {
           this._log.debug("Aborting pull-only provider registration.");
@@ -358,18 +357,17 @@ this.ProviderManager.prototype = Object.
       Task.spawn(function unregisterPullProviders() {
 
       if (inFlightPromise) {
         this._log.debug("Waiting for in-flight pull-only provider activity " +
                         "to complete before unregistering.");
         try {
           yield inFlightPromise;
         } catch (ex) {
-          this._log.warn("Error when waiting for existing pull-only promise: " +
-                         CommonUtils.exceptionStr(ex));
+          this._log.warn("Error when waiting for existing pull-only promise", ex);
         }
       }
 
       for (let provider of this.providers) {
         if (this._pullOnlyProvidersState != this.PULL_ONLY_UNREGISTERING) {
           return;
         }
 
@@ -492,18 +490,17 @@ this.ProviderManager.prototype = Object.
         continue;
       }
 
       let promise = collectPromise.then(function onCollected(result) {
         if (onCollect) {
           try {
             onCollect(entry, result);
           } catch (ex) {
-            this._log.warn("onCollect callback threw: " +
-                           CommonUtils.exceptionStr(ex));
+            this._log.warn("onCollect callback threw", ex);
           }
         }
 
         return CommonUtils.laterTickResolvingPromise(result);
       });
 
       promises.push([provider.name, promise]);
     }
@@ -540,23 +537,22 @@ this.ProviderManager.prototype = Object.
   },
 
   /**
    * Record an error that occurred operating on a provider.
    */
   _recordProviderError: function (name, msg, ex) {
     msg = "Provider error: " + name + ": " + msg;
     if (ex) {
-      msg += ": " + CommonUtils.exceptionStr(ex);
+      msg += ": " + Log.exceptionStr(ex);
     }
     this._log.warn(msg);
 
     if (this.onProviderError) {
       try {
         this.onProviderError(msg);
       } catch (callError) {
-        this._log.warn("Exception when calling onProviderError callback: " +
-                       CommonUtils.exceptionStr(callError));
+        this._log.warn("Exception when calling onProviderError callback", callError);
       }
     }
   },
 });
 
--- a/services/metrics/storage.jsm
+++ b/services/metrics/storage.jsm
@@ -21,17 +21,16 @@ const MILLISECONDS_PER_DAY = 24 * 60 * 6
 
 Cu.import("resource://gre/modules/Promise.jsm");
 Cu.import("resource://gre/modules/Sqlite.jsm");
 Cu.import("resource://gre/modules/AsyncShutdown.jsm");
 Cu.import("resource://gre/modules/Task.jsm");
 Cu.import("resource://gre/modules/Log.jsm");
 Cu.import("resource://services-common/utils.js");
 
-
 // These do not account for leap seconds. Meh.
 function dateToDays(date) {
   return Math.floor(date.getTime() / MILLISECONDS_PER_DAY);
 }
 
 function daysToDate(days) {
   return new Date(days * MILLISECONDS_PER_DAY);
 }
@@ -1423,18 +1422,17 @@ MetricsStorageSqliteBackend.prototype = 
     this._log.trace("Performing queued operation.");
     let [func, deferred] = this._queuedOperations.shift();
     let promise;
 
     try {
       this._queuedInProgress = true;
       promise = func();
     } catch (ex) {
-      this._log.warn("Queued operation threw during execution: " +
-                     CommonUtils.exceptionStr(ex));
+      this._log.warn("Queued operation threw during execution", ex);
       this._queuedInProgress = false;
       deferred.reject(ex);
       this._popAndPerformQueuedOperation();
       return;
     }
 
     if (!promise || typeof(promise.then) != "function") {
       let msg = "Queued operation did not return a promise: " + func;
@@ -1449,18 +1447,17 @@ MetricsStorageSqliteBackend.prototype = 
     promise.then(
       function onSuccess(result) {
         this._log.trace("Queued operation completed.");
         this._queuedInProgress = false;
         deferred.resolve(result);
         this._popAndPerformQueuedOperation();
       }.bind(this),
       function onError(error) {
-        this._log.warn("Failure when performing queued operation: " +
-                       CommonUtils.exceptionStr(error));
+        this._log.warn("Failure when performing queued operation", error);
         this._queuedInProgress = false;
         deferred.reject(error);
         this._popAndPerformQueuedOperation();
       }.bind(this)
     );
   },
 
   /**
--- a/services/sync/modules/addonsreconciler.js
+++ b/services/sync/modules/addonsreconciler.js
@@ -483,18 +483,17 @@ AddonsReconciler.prototype = {
   _addChange: function _addChange(date, change, state) {
     this._log.info("Change recorded for " + state.id);
     this._changes.push([date, change, state.id]);
 
     for (let listener of this._listeners) {
       try {
         listener.changeListener.call(listener, date, change, state);
       } catch (ex) {
-        this._log.warn("Exception calling change listener: " +
-                       Utils.exceptionStr(ex));
+        this._log.warn("Exception calling change listener", ex);
       }
     }
   },
 
   /**
    * Obtain the set of changes to add-ons since the date passed.
    *
    * This will return an array of arrays. Each entry in the array has the
@@ -630,17 +629,17 @@ AddonsReconciler.prototype = {
       // See note for _shouldPersist.
       if (this._shouldPersist) {
         let cb = Async.makeSpinningCallback();
         this.saveState(null, cb);
         cb.wait();
       }
     }
     catch (ex) {
-      this._log.warn("Exception: " + Utils.exceptionStr(ex));
+      this._log.warn("Exception", ex);
     }
   },
 
   // AddonListeners
   onEnabling: function onEnabling(addon, requiresRestart) {
     this._handleListener("onEnabling", addon, requiresRestart);
   },
   onEnabled: function onEnabled(addon) {
--- a/services/sync/modules/addonutils.js
+++ b/services/sync/modules/addonutils.js
@@ -142,17 +142,17 @@ AddonUtilsInternal.prototype = {
 
             cb(new Error("Download failed: " + install.error), null);
           }
         };
         install.addListener(listener);
         install.install();
       }
       catch (ex) {
-        this._log.error("Error installing add-on: " + Utils.exceptionstr(ex));
+        this._log.error("Error installing add-on", ex);
         cb(ex, null);
       }
     }.bind(this));
   },
 
   /**
    * Uninstalls the Addon instance and invoke a callback when it is done.
    *
--- a/services/sync/modules/engines.js
+++ b/services/sync/modules/engines.js
@@ -10,17 +10,16 @@ this.EXPORTED_SYMBOLS = [
   "Store"
 ];
 
 var {classes: Cc, interfaces: Ci, results: Cr, utils: Cu} = Components;
 
 Cu.import("resource://services-common/async.js");
 Cu.import("resource://gre/modules/Log.jsm");
 Cu.import("resource://services-common/observers.js");
-Cu.import("resource://services-common/utils.js");
 Cu.import("resource://services-sync/constants.js");
 Cu.import("resource://services-sync/identity.js");
 Cu.import("resource://services-sync/record.js");
 Cu.import("resource://services-sync/resource.js");
 Cu.import("resource://services-sync/util.js");
 
 /*
  * Trackers are associated with a single engine and deal with
@@ -303,18 +302,17 @@ Store.prototype = {
       try {
         this.applyIncoming(record);
       } catch (ex if (ex.code == Engine.prototype.eEngineAbortApplyIncoming)) {
         // This kind of exception should have a 'cause' attribute, which is an
         // originating exception.
         // ex.cause will carry its stack with it when rethrown.
         throw ex.cause;
       } catch (ex if !Async.isShutdownException(ex)) {
-        this._log.warn("Failed to apply incoming record " + record.id);
-        this._log.warn("Encountered exception: " + Utils.exceptionStr(ex));
+        this._log.warn("Failed to apply incoming record " + record.id, ex);
         this.engine._noteApplyFailure();
         failed.push(record.id);
       }
     };
     return failed;
   },
 
   /**
@@ -573,26 +571,21 @@ EngineManager.prototype = {
       let engine = new engineObject(this.service);
       let name = engine.name;
       if (name in this._engines) {
         this._log.error("Engine '" + name + "' is already registered!");
       } else {
         this._engines[name] = engine;
       }
     } catch (ex) {
-      this._log.error(CommonUtils.exceptionStr(ex));
-
-      let mesg = ex.message ? ex.message : ex;
       let name = engineObject || "";
       name = name.prototype || "";
       name = name.name || "";
 
-      let out = "Could not initialize engine '" + name + "': " + mesg;
-      this._log.error(out);
-
+      this._log.error(`Could not initialize engine ${name}`, ex);
       return engineObject;
     }
   },
 
   unregister: function (val) {
     let name = val;
     if (val instanceof Engine) {
       name = val.name;
@@ -812,17 +805,17 @@ SyncEngine.prototype = {
       }
     });
   },
 
   get previousFailed() {
     return this._previousFailed;
   },
   set previousFailed(val) {
-    let cb = (error) => this._log.error(Utils.exceptionStr(error));
+    let cb = (error) => this._log.error("Failed to set previousFailed", error);
     // Coerce the array to a string for more efficient comparison.
     if (val + "" == this._previousFailed) {
       return;
     }
     this._previousFailed = val;
     Utils.namedTimer(function () {
       Utils.jsonSave("failed/" + this.name, this, val, cb);
     }, 0, this, "_previousFailedDelay");
@@ -995,18 +988,17 @@ SyncEngine.prototype = {
 
     function doApplyBatch() {
       this._tracker.ignoreAll = true;
       try {
         failed = failed.concat(this._store.applyIncomingBatch(applyBatch));
       } catch (ex if !Async.isShutdownException(ex)) {
         // Catch any error that escapes from applyIncomingBatch. At present
         // those will all be abort events.
-        this._log.warn("Got exception " + Utils.exceptionStr(ex) +
-                       ", aborting processIncoming.");
+        this._log.warn("Got exception, aborting processIncoming", ex);
         aborting = ex;
       }
       this._tracker.ignoreAll = false;
       applyBatch = [];
     }
 
     function doApplyBatchAndPersistFailed() {
       // Apply remaining batch.
@@ -1064,44 +1056,43 @@ SyncEngine.prototype = {
           switch (strategy) {
             case null:
               // Retry succeeded! No further handling.
               break;
             case SyncEngine.kRecoveryStrategy.retry:
               self._log.debug("Ignoring second retry suggestion.");
               // Fall through to error case.
             case SyncEngine.kRecoveryStrategy.error:
-              self._log.warn("Error decrypting record: " + Utils.exceptionStr(ex));
+              self._log.warn("Error decrypting record", ex);
               self._noteApplyFailure();
               failed.push(item.id);
               return;
             case SyncEngine.kRecoveryStrategy.ignore:
               self._log.debug("Ignoring record " + item.id +
                               " with bad HMAC: already handled.");
               return;
           }
         }
       } catch (ex) {
-        self._log.warn("Error decrypting record: " + Utils.exceptionStr(ex));
+        self._log.warn("Error decrypting record", ex);
         self._noteApplyFailure();
         failed.push(item.id);
         return;
       }
 
       let shouldApply;
       try {
         shouldApply = self._reconcile(item);
       } catch (ex if (ex.code == Engine.prototype.eEngineAbortApplyIncoming)) {
         self._log.warn("Reconciliation failed: aborting incoming processing.");
         self._noteApplyFailure();
         failed.push(item.id);
         aborting = ex.cause;
       } catch (ex if !Async.isShutdownException(ex)) {
-        self._log.warn("Failed to reconcile incoming record " + item.id);
-        self._log.warn("Encountered exception: " + Utils.exceptionStr(ex));
+        self._log.warn("Failed to reconcile incoming record " + item.id, ex);
         self._noteApplyFailure();
         failed.push(item.id);
         return;
       }
 
       if (shouldApply) {
         count.applied++;
         applyBatch.push(item);
@@ -1480,17 +1471,17 @@ SyncEngine.prototype = {
         try {
           let out = this._createRecord(id);
           if (this._log.level <= Log.Level.Trace)
             this._log.trace("Outgoing: " + out);
 
           out.encrypt(this.service.collectionKeys.keyForCollection(this.name));
           up.pushData(out);
         } catch (ex if !Async.isShutdownException(ex)) {
-          this._log.warn("Error creating record: " + Utils.exceptionStr(ex));
+          this._log.warn("Error creating record", ex);
         }
 
         // Partial upload
         if ((++count % MAX_UPLOAD_RECORDS) == 0)
           doUpload((count - MAX_UPLOAD_RECORDS) + " - " + count + " out");
 
         this._store._sleep(0);
       }
@@ -1571,17 +1562,17 @@ SyncEngine.prototype = {
       canDecrypt = true;
     }.bind(this);
 
     // Any failure fetching/decrypting will just result in false
     try {
       this._log.trace("Trying to decrypt a record from the server..");
       test.get();
     } catch (ex if !Async.isShutdownException(ex)) {
-      this._log.debug("Failed test decrypt: " + Utils.exceptionStr(ex));
+      this._log.debug("Failed test decrypt", ex);
     }
 
     return canDecrypt;
   },
 
   _resetClient: function () {
     this.resetLastSync();
     this.previousFailed = [];
--- a/services/sync/modules/engines/bookmarks.js
+++ b/services/sync/modules/engines/bookmarks.js
@@ -421,35 +421,32 @@ BookmarksEngine.prototype = {
         yield PlacesBackups.create(null, true);
         this._log.debug("Bookmarks backup done.");
       }
     }.bind(this)).then(
       cb, ex => {
         // Failure to create a backup is somewhat bad, but probably not bad
         // enough to prevent syncing of bookmarks - so just log the error and
         // continue.
-        this._log.warn("Got exception \"" + Utils.exceptionStr(ex) +
-                       "\" backing up bookmarks, but continuing with sync.");
+        this._log.warn("Error while backing up bookmarks, but continuing with sync", ex);
         cb();
       }
     );
 
     cb.wait();
 
     this.__defineGetter__("_guidMap", function() {
       // Create a mapping of folder titles and separator positions to GUID.
       // We do this lazily so that we don't do any work unless we reconcile
       // incoming items.
       let guidMap;
       try {
         guidMap = this._buildGUIDMap();
       } catch (ex if !Async.isShutdownException(ex)) {
-        this._log.warn("Got exception \"" + Utils.exceptionStr(ex) +
-                       "\" building GUID map." +
-                       " Skipping all other incoming items.");
+        this._log.warn("Error while building GUID map, skipping all other incoming items", ex);
         throw {code: Engine.prototype.eEngineAbortApplyIncoming,
                cause: ex};
       }
       delete this._guidMap;
       return this._guidMap = guidMap;
     });
 
     this._store._childrenToOrder = {};
@@ -686,17 +683,17 @@ BookmarksStore.prototype = {
                     parentId);
     try {
       if (parentId > 0) {
         PlacesUtils.bookmarks.moveItem(itemId, parentId,
                                        PlacesUtils.bookmarks.DEFAULT_INDEX);
         return true;
       }
     } catch(ex) {
-      this._log.debug("Failed to reparent item. " + Utils.exceptionStr(ex));
+      this._log.debug("Failed to reparent item", ex);
     }
     return false;
   },
 
   // Turn a record's nsINavBookmarksService constant and other attributes into
   // a granular type for comparison.
   _recordType: function _recordType(itemId) {
     let bms  = PlacesUtils.bookmarks;
@@ -1318,18 +1315,17 @@ BookmarksStore.prototype = {
     if (!itemID || !tags) {
       return;
     }
 
     try {
       let u = PlacesUtils.bookmarks.getBookmarkURI(itemID);
       this._tagURI(u, tags);
     } catch (e) {
-      this._log.warn("Got exception fetching URI for " + itemID + ": not tagging. " +
-                     Utils.exceptionStr(e));
+      this._log.warn(`Got exception fetching URI for ${itemID} not tagging`, e);
 
       // I guess it doesn't have a URI. Don't try to tag it.
       return;
     }
   },
 
   /**
    * Associate the provided URI with the provided array of tags.
--- a/services/sync/modules/engines/passwords.js
+++ b/services/sync/modules/engines/passwords.js
@@ -64,17 +64,17 @@ PasswordEngine.prototype = {
         } else {
           this._log.debug("Didn't find any passwords to delete");
         }
         // If there were no ids to delete, or we succeeded, or got a 400,
         // record success.
         Svc.Prefs.set("deletePwdFxA", true);
         Svc.Prefs.reset("deletePwd"); // The old prefname we previously used.
       } catch (ex if !Async.isShutdownException(ex)) {
-        this._log.debug("Password deletes failed: " + Utils.exceptionStr(ex));
+        this._log.debug("Password deletes failed", ex);
       }
     }
   },
 
   _findDupe: function (item) {
     let login = this._store._nsLoginInfoFromRecord(item);
     if (!login) {
       return;
@@ -228,18 +228,17 @@ PasswordStore.prototype = {
     }
 
     this._log.debug("Adding login for " + record.hostname);
     this._log.trace("httpRealm: " + JSON.stringify(login.httpRealm) + "; " +
                     "formSubmitURL: " + JSON.stringify(login.formSubmitURL));
     try {
       Services.logins.addLogin(login);
     } catch(ex) {
-      this._log.debug("Adding record " + record.id +
-                      " resulted in exception " + Utils.exceptionStr(ex));
+      this._log.debug(`Adding record ${record.id} resulted in exception`, ex);
     }
   },
 
   remove: function (record) {
     this._log.trace("Removing login " + record.id);
 
     let loginItem = this._getLoginFromGUID(record.id);
     if (!loginItem) {
@@ -261,19 +260,17 @@ PasswordStore.prototype = {
     let newinfo = this._nsLoginInfoFromRecord(record);
     if (!newinfo) {
       return;
     }
 
     try {
       Services.logins.modifyLogin(loginItem, newinfo);
     } catch(ex) {
-      this._log.debug("Modifying record " + record.id +
-                      " resulted in exception " + Utils.exceptionStr(ex) +
-                      ". Not modifying.");
+      this._log.debug(`Modifying record ${record.id} resulted in exception; not modifying`, ex);
     }
   },
 
   wipe: function () {
     Services.logins.removeAllLogins();
   },
 };
 
--- a/services/sync/modules/identity.js
+++ b/services/sync/modules/identity.js
@@ -321,17 +321,17 @@ IdentityManager.prototype = {
                      "set!");
       return null;
     }
 
     if (!this._syncKeyBundle) {
       try {
         this._syncKeyBundle = new SyncKeyBundle(this.username, this.syncKey);
       } catch (ex) {
-        this._log.warn(Utils.exceptionStr(ex));
+        this._log.warn("Failed to create sync bundle", ex);
         return null;
       }
     }
 
     return this._syncKeyBundle;
   },
 
   /**
--- a/services/sync/modules/policies.js
+++ b/services/sync/modules/policies.js
@@ -576,17 +576,17 @@ ErrorHandler.prototype = {
         break;
       case "weave:engine:sync:error":
         let exception = subject;  // exception thrown by engine's sync() method
         let engine_name = data;   // engine name that threw the exception
 
         this.checkServerError(exception, "engines/" + engine_name);
 
         Status.engines = [engine_name, exception.failureCode || ENGINE_UNKNOWN_FAIL];
-        this._log.debug(engine_name + " failed: " + Utils.exceptionStr(exception));
+        this._log.debug(engine_name + " failed", exception);
 
         Services.telemetry.getKeyedHistogramById("WEAVE_ENGINE_SYNC_ERRORS")
                           .add(engine_name);
         break;
       case "weave:service:login:error":
         this._log.error("Sync encountered a login error");
         this.resetFileLog();
 
--- a/services/sync/modules/record.js
+++ b/services/sync/modules/record.js
@@ -234,17 +234,17 @@ RecordManager.prototype = {
       if (!this.response.success)
         return null;
 
       let record = new this._recordType(url);
       record.deserialize(this.response);
 
       return this.set(url, record);
     } catch (ex if !Async.isShutdownException(ex)) {
-      this._log.debug("Failed to import record: " + Utils.exceptionStr(ex));
+      this._log.debug("Failed to import record", ex);
       return null;
     }
   },
 
   get: function RecordMgr_get(url) {
     // Use a url string as the key to the hash
     let spec = url.spec ? url.spec : url;
     if (spec in this._records)
--- a/services/sync/modules/resource.js
+++ b/services/sync/modules/resource.js
@@ -228,17 +228,17 @@ AsyncResource.prototype = {
     // is performed asynchronously.
     let listener = new ChannelListener(this._onComplete, this._onProgress,
                                        this._log, this.ABORT_TIMEOUT);
     channel.requestMethod = action;
     try {
       channel.asyncOpen(listener, null);
     } catch (ex) {
       // asyncOpen can throw in a bunch of cases -- e.g., a forbidden port.
-      this._log.warn("Caught an error in asyncOpen: " + CommonUtils.exceptionStr(ex));
+      this._log.warn("Caught an error in asyncOpen", ex);
       CommonUtils.nextTick(callback.bind(this, ex));
     }
   },
 
   _onComplete: function _onComplete(error, data, channel) {
     this._log.trace("In _onComplete. Error is " + error + ".");
 
     if (error) {
@@ -275,19 +275,17 @@ AsyncResource.prototype = {
 
       // Additionally give the full response body when Trace logging.
       if (this._log.level <= Log.Level.Trace)
         this._log.trace(action + " body: " + data);
 
     } catch(ex) {
       // Got a response, but an exception occurred during processing.
       // This shouldn't occur.
-      this._log.warn("Caught unexpected exception " + CommonUtils.exceptionStr(ex) +
-                     " in _onComplete.");
-      this._log.debug(CommonUtils.stackTrace(ex));
+      this._log.warn("Caught unexpected exception in _oncomplete", ex);
     }
 
     // Process headers. They can be empty, or the call can otherwise fail, so
     // put this in its own try block.
     let headers = {};
     try {
       this._log.trace("Processing response headers.");
 
@@ -315,35 +313,33 @@ AsyncResource.prototype = {
       let contentLength = headers["content-length"];
       if (success && contentLength && data &&
           contentLength != data.length) {
         this._log.warn("The response body's length of: " + data.length +
                        " doesn't match the header's content-length of: " +
                        contentLength + ".");
       }
     } catch (ex) {
-      this._log.debug("Caught exception " + CommonUtils.exceptionStr(ex) +
-                      " visiting headers in _onComplete.");
-      this._log.debug(CommonUtils.stackTrace(ex));
+      this._log.debug("Caught exception visiting headers in _onComplete", ex);
     }
 
     let ret     = new String(data);
     ret.url     = channel.URI.spec;
     ret.status  = status;
     ret.success = success;
     ret.headers = headers;
 
     // Make a lazy getter to convert the json response into an object.
     // Note that this can cause a parse error to be thrown far away from the
     // actual fetch, so be warned!
     XPCOMUtils.defineLazyGetter(ret, "obj", function() {
       try {
         return JSON.parse(ret);
       } catch (ex) {
-        this._log.warn("Got exception parsing response body: \"" + CommonUtils.exceptionStr(ex));
+        this._log.warn("Got exception parsing response body", ex);
         // Stringify to avoid possibly printing non-printable characters.
         this._log.debug("Parse fail: Response body starts: \"" +
                         JSON.stringify((ret + "").slice(0, 100)) +
                         "\".");
         throw ex;
       }
     }.bind(this));
 
@@ -539,50 +535,49 @@ ChannelListener.prototype = {
   },
 
   onDataAvailable: function Channel_onDataAvail(req, cb, stream, off, count) {
     let siStream;
     try {
       siStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
       siStream.init(stream);
     } catch (ex) {
-      this._log.warn("Exception creating nsIScriptableInputStream." + CommonUtils.exceptionStr(ex));
+      this._log.warn("Exception creating nsIScriptableInputStream", ex);
       this._log.debug("Parameters: " + req.URI.spec + ", " + stream + ", " + off + ", " + count);
       // Cannot proceed, so rethrow and allow the channel to cancel itself.
       throw ex;
     }
 
     try {
       this._data += siStream.read(count);
     } catch (ex) {
       this._log.warn("Exception thrown reading " + count + " bytes from " + siStream + ".");
       throw ex;
     }
 
     try {
       this._onProgress();
     } catch (ex if !Async.isShutdownException(ex)) {
       this._log.warn("Got exception calling onProgress handler during fetch of "
-                     + req.URI.spec);
-      this._log.debug(CommonUtils.exceptionStr(ex));
+                     + req.URI.spec, ex);
       this._log.trace("Rethrowing; expect a failure code from the HTTP channel.");
       throw ex;
     }
 
     this.delayAbort();
   },
 
   /**
    * Create or push back the abort timer that kills this request.
    */
   delayAbort: function delayAbort() {
     try {
       CommonUtils.namedTimer(this.abortRequest, this._timeout, this, "abortTimer");
     } catch (ex) {
-      this._log.warn("Got exception extending abort timer: " + CommonUtils.exceptionStr(ex));
+      this._log.warn("Got exception extending abort timer", ex);
     }
   },
 
   abortRequest: function abortRequest() {
     // Ignore any callbacks if we happen to get any now
     this.onStopRequest = function() {};
     let error = Components.Exception("Aborting due to channel inactivity.",
                                      Cr.NS_ERROR_NET_TIMEOUT);
@@ -666,19 +661,19 @@ ChannelNotificationListener.prototype = 
             this._log.debug("Header: " + header + " = " + printed);
             newChannel.setRequestHeader(header, value, false);
           } else {
             this._log.warn("No value for header " + header);
           }
         }
       }
     } catch (ex) {
-      this._log.error("Error copying headers: " + CommonUtils.exceptionStr(ex));
+      this._log.error("Error copying headers", ex);
     }
 
     // We let all redirects proceed.
     try {
       callback.onRedirectVerifyCallback(Cr.NS_OK);
     } catch (ex) {
-      this._log.error("onRedirectVerifyCallback threw!" + CommonUtils.exceptionStr(ex));
+      this._log.error("onRedirectVerifyCallback threw!", ex);
     }
   }
 };
--- a/services/sync/modules/service.js
+++ b/services/sync/modules/service.js
@@ -16,17 +16,16 @@ const CLUSTER_BACKOFF = 5 * 60 * 1000; /
 const PBKDF2_KEY_BYTES = 16;
 
 const CRYPTO_COLLECTION = "crypto";
 const KEYS_WBO = "keys";
 
 Cu.import("resource://gre/modules/Preferences.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Log.jsm");
-Cu.import("resource://services-common/utils.js");
 Cu.import("resource://services-sync/constants.js");
 Cu.import("resource://services-sync/engines.js");
 Cu.import("resource://services-sync/engines/clients.js");
 Cu.import("resource://services-sync/identity.js");
 Cu.import("resource://services-sync/policies.js");
 Cu.import("resource://services-sync/record.js");
 Cu.import("resource://services-sync/resource.js");
 Cu.import("resource://services-sync/rest.js");
@@ -485,18 +484,17 @@ Sync11Service.prototype = {
         let engineName = name + "Engine";
         if (!(engineName in ns)) {
           this._log.warn("Could not find exported engine instance: " + engineName);
           continue;
         }
 
         this.engineManager.register(ns[engineName]);
       } catch (ex) {
-        this._log.warn("Could not register engine " + name + ": " +
-                       CommonUtils.exceptionStr(ex));
+        this._log.warn("Could not register engine " + name, ex);
       }
     }
 
     this.engineManager.setDeclined(declined);
   },
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
                                          Ci.nsISupportsWeakReference]),
@@ -683,18 +681,17 @@ Sync11Service.prototype = {
       }
       else {
         // No update needed: we're good!
         return true;
       }
 
     } catch (ex) {
       // This means no keys are present, or there's a network error.
-      this._log.debug("Failed to fetch and verify keys: "
-                      + Utils.exceptionStr(ex));
+      this._log.debug("Failed to fetch and verify keys", ex);
       this.errorHandler.checkServerError(ex, "crypto/keys");
       return false;
     }
   },
 
   verifyLogin: function verifyLogin(allow40XRecovery = true) {
     if (!this.identity.username) {
       this._log.warn("No username in verifyLogin.");
@@ -780,17 +777,17 @@ Sync11Service.prototype = {
         default:
           // Server didn't respond with something that we expected
           this.status.login = LOGIN_FAILED_SERVER_ERROR;
           this.errorHandler.checkServerError(test, "info/collections");
           return false;
       }
     } catch (ex) {
       // Must have failed on some network issue
-      this._log.debug("verifyLogin failed: " + Utils.exceptionStr(ex));
+      this._log.debug("verifyLogin failed", ex);
       this.status.login = LOGIN_FAILED_NETWORK_ERROR;
       this.errorHandler.checkServerError(ex, "info/collections");
       return false;
     }
   },
 
   generateNewSymmetricKeys: function generateNewSymmetricKeys() {
     this._log.info("Generating new keys WBO...");
@@ -853,18 +850,17 @@ Sync11Service.prototype = {
     let client = new UserAPI10Client(this.userAPIURI);
     let cb = Async.makeSpinningCallback();
     client.changePassword(this.identity.username,
                           this.identity.basicPassword, newPassword, cb);
 
     try {
       cb.wait();
     } catch (ex) {
-      this._log.debug("Password change failed: " +
-                      CommonUtils.exceptionStr(ex));
+      this._log.debug("Password change failed", ex);
       return false;
     }
 
     // Save the new password for requests and login manager.
     this.identity.basicPassword = newPassword;
     this.persistLogin();
     return true;
   },
@@ -900,18 +896,17 @@ Sync11Service.prototype = {
 
     // Deletion doesn't make sense if we aren't set up yet!
     if (this.clusterURL != "") {
       // Clear client-specific data from the server, including disabled engines.
       for (let engine of [this.clientsEngine].concat(this.engineManager.getAll())) {
         try {
           engine.removeClientData();
         } catch(ex) {
-          this._log.warn("Deleting client data for " + engine.name + " failed:"
-                         + Utils.exceptionStr(ex));
+          this._log.warn(`Deleting client data for ${engine.name} failed`, ex);
         }
       }
       this._log.debug("Finished deleting client data.");
     } else {
       this._log.debug("Skipping client data removal: no cluster URL.");
     }
 
     // We want let UI consumers of the following notification know as soon as
@@ -1532,35 +1527,34 @@ Sync11Service.prototype = {
     let response;
     if (!collections) {
       // Strip the trailing slash.
       let res = this.resource(this.storageURL.slice(0, -1));
       res.setHeader("X-Confirm-Delete", "1");
       try {
         response = res.delete();
       } catch (ex) {
-        this._log.debug("Failed to wipe server: " + CommonUtils.exceptionStr(ex));
+        this._log.debug("Failed to wipe server", ex);
         throw ex;
       }
       if (response.status != 200 && response.status != 404) {
         this._log.debug("Aborting wipeServer. Server responded with " +
                         response.status + " response for " + this.storageURL);
         throw response;
       }
       return response.headers["x-weave-timestamp"];
     }
 
     let timestamp;
     for (let name of collections) {
       let url = this.storageURL + name;
       try {
         response = this.resource(url).delete();
       } catch (ex) {
-        this._log.debug("Failed to wipe '" + name + "' collection: " +
-                        Utils.exceptionStr(ex));
+        this._log.debug("Failed to wipe '" + name + "' collection", ex);
         throw ex;
       }
 
       if (response.status != 200 && response.status != 404) {
         this._log.debug("Aborting wipeServer. Server responded with " +
                         response.status + " response for " + url);
         throw response;
       }
@@ -1696,18 +1690,17 @@ Sync11Service.prototype = {
     }
 
     let info_type = "info/" + type;
     this._log.trace("Retrieving '" + info_type + "'...");
     let url = this.userBaseURL + info_type;
     return this.getStorageRequest(url).get(function onComplete(error) {
       // Note: 'this' is the request.
       if (error) {
-        this._log.debug("Failed to retrieve '" + info_type + "': " +
-                        Utils.exceptionStr(error));
+        this._log.debug("Failed to retrieve '" + info_type + "'", error);
         return callback(error);
       }
       if (this.response.status != 200) {
         this._log.debug("Failed to retrieve '" + info_type +
                         "': server responded with HTTP" +
                         this.response.status);
         return callback(this.response);
       }
--- a/services/sync/modules/stages/enginesync.js
+++ b/services/sync/modules/stages/enginesync.js
@@ -137,18 +137,17 @@ EngineSynchronizer.prototype = {
         this._syncEngine(this.service.clientsEngine);
       }
     }
 
     // Update engines because it