diff --git a/b2g/chrome/content/devtools.js b/b2g/chrome/content/devtools.js
index a046fa4916a..5cdc449f601 100644
--- a/b2g/chrome/content/devtools.js
+++ b/b2g/chrome/content/devtools.js
@@ -15,6 +15,12 @@ XPCOMUtils.defineLazyGetter(this, 'WebConsoleUtils', function() {
return devtools.require("devtools/toolkit/webconsole/utils").Utils;
});
+XPCOMUtils.defineLazyGetter(this, 'EventLoopLagFront', function() {
+ const {devtools} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
+ return devtools.require("devtools/server/actors/eventlooplag").EventLoopLagFront;
+});
+
+
/**
* The Widget Panel is an on-device developer tool that displays widgets,
* showing visual debug information about apps. Each widget corresponds to a
@@ -358,4 +364,67 @@ let consoleWatcher = {
return source;
}
};
+
devtoolsWidgetPanel.registerWatcher(consoleWatcher);
+
+
+let jankWatcher = {
+ _client: null,
+ _fronts: new Map(),
+ _active: false,
+
+ init: function(client) {
+ this._client = client;
+
+ SettingsListener.observe('devtools.hud.jank', false,
+ this.settingsListener.bind(this));
+ },
+
+ settingsListener: function(value) {
+ if (this._active == value) {
+ return;
+ }
+ this._active = value;
+
+ // Toggle the state of existing fronts.
+ let fronts = this._fronts;
+ for (let app of fronts.keys()) {
+ if (value) {
+ fronts.get(app).start();
+ } else {
+ fronts.get(app).stop();
+ app.metrics.set('jank', 0);
+ app.display();
+ }
+ }
+ },
+
+ trackApp: function(app) {
+ app.metrics.set('jank', 0);
+
+ let front = new EventLoopLagFront(this._client, app.actor);
+ this._fronts.set(app, front);
+
+ front.on('event-loop-lag', time => {
+ app.metrics.set('jank', time);
+
+ if (!app.display()) {
+ devtoolsWidgetPanel.log('jank: ' + time + 'ms');
+ }
+ });
+
+ if (this._active) {
+ front.start();
+ }
+ },
+
+ untrackApp: function(app) {
+ let fronts = this._fronts;
+ if (fronts.has(app)) {
+ fronts.get(app).destroy();
+ fronts.delete(app);
+ }
+ }
+};
+
+devtoolsWidgetPanel.registerWatcher(jankWatcher);
diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc
index 68607ce9d28..21abe3eb6fb 100644
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -50,6 +50,9 @@
+#ifdef XP_MACOSX
+
+#endif
@@ -350,6 +353,9 @@
+#ifdef XP_MACOSX
+
+#endif
diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml
index 8f2c28a324b..aa408cabe83 100644
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -3037,17 +3037,7 @@
filter.addProgressListener(tabListener, nsIWebProgress.NOTIFY_ALL);
this.mTabListeners[0] = tabListener;
this.mTabFilters[0] = filter;
-
- try {
- // We assume this can only fail because mCurrentBrowser's docShell
- // hasn't been created, yet. This may be caused by code accessing
- // gBrowser before the window has finished loading.
- this._addProgressListenerForInitialTab();
- } catch (e) {
- // The binding was constructed too early, wait until the initial
- // tab's document is ready, then add the progress listener.
- this._waitForInitialContentDocument();
- }
+ this.webProgress.addProgressListener(filter, nsIWebProgress.NOTIFY_ALL);
this.style.backgroundColor =
Services.prefs.getBoolPref("browser.display.use_system_colors") ?
@@ -3083,31 +3073,6 @@
]]>