Bug 1239750 - Add DAMP measurement for bulk console.log performance;r=fitzgen draft
authorBrian Grinstead <bgrinstead@mozilla.com>
Wed, 20 Jan 2016 11:38:32 -0800
changeset 323623 bcb2eae790e6abcb92523ff692289aa249c657f3
parent 323622 41efc3cbf8d6a498cf0f3661c88cf7eed379c42d
child 323624 b640a58d7a025edca6e2a066ab55146c28094366
push id9754
push userbgrinstead@mozilla.com
push dateWed, 20 Jan 2016 19:38:41 +0000
reviewersfitzgen
bugs1239750
milestone46.0a1
Bug 1239750 - Add DAMP measurement for bulk console.log performance;r=fitzgen
testing/talos/talos/tests/devtools/addon/content/damp.html
testing/talos/talos/tests/devtools/addon/content/damp.js
--- a/testing/talos/talos/tests/devtools/addon/content/damp.html
+++ b/testing/talos/talos/tests/devtools/addon/content/damp.html
@@ -12,27 +12,29 @@ var defaultConfig = {
   subtests: {
     webconsoleOpen: true,
     inspectorOpen: true,
     debuggerOpen: true,
     styleEditorOpen: true,
     performanceOpen: true,
     netmonitorOpen: true,
     saveAndReadHeapSnapshot: true,
+    consoleBulkLogging: true,
   }
 };
 
 var testsInfo = {
   webconsoleOpen: "Measure open/close toolbox on webconsole panel",
   inspectorOpen: "Measure open/close toolbox on inspector panel",
   debuggerOpen: "Measure open/close toolbox on debugger panel",
   styleEditorOpen: "Measure open/close toolbox on style editor panel",
   performanceOpen: "Measure open/close toolbox on performance panel",
   netmonitorOpen: "Measure open/close toolbox on network monitor panel",
   saveAndReadHeapSnapshot: "Measure open/close toolbox on memory panel and save/read heap snapshot",
+  consoleBulkLogging: "Measure time for a bunch of sync console.log statements to appear",
 };
 
 function updateConfig() {
   config = {subtests: []};
   for (var test in defaultConfig.subtests) {
     if ($("subtest-" + test).checked) {
       config.subtests.push(test);
     }
--- a/testing/talos/talos/tests/devtools/addon/content/damp.js
+++ b/testing/talos/talos/tests/devtools/addon/content/damp.js
@@ -103,16 +103,65 @@ Damp.prototype = {
     let end = performance.now();
     this._results.push({
       name: label + ".readHeapSnapshot",
       value: end - start
     });
     return Promise.resolve();
   },
 
+  _consoleBulkLoggingTest: Task.async(function*() {
+    let TOTAL_MESSAGES = 10;
+    let tab = yield this.testSetup(SIMPLE_URL);
+    let messageManager = tab.linkedBrowser.messageManager;
+    let {toolbox} = yield this.openToolbox("webconsole");
+    let webconsole = toolbox.getPanel("webconsole");
+
+    // Resolve once the last message has been received.
+    let allMessagesReceived = new Promise(resolve => {
+      function receiveMessages(e, messages) {
+        for (let m of messages) {
+          if (m.node.textContent.includes("damp " + TOTAL_MESSAGES)) {
+            webconsole.hud.ui.off("new-messages", receiveMessages);
+            // Wait for the console to redraw
+            requestAnimationFrame(resolve);
+          }
+        }
+      }
+      webconsole.hud.ui.on("new-messages", receiveMessages);
+    });
+
+    // Load a frame script using a data URI so we can do logs
+    // from the page.  So this is running in content.
+    messageManager.loadFrameScript("data:,(" + encodeURIComponent(
+      `function () {
+        addMessageListener("do-logs", function () {
+          for (var i = 0; i < ${TOTAL_MESSAGES}; i++) {
+            content.console.log('damp', i+1, content);
+          }
+        });
+      }`
+    ) + ")()", true);
+
+    // Kick off the logging
+    messageManager.sendAsyncMessage("do-logs");
+
+    let start = performance.now();
+    yield allMessagesReceived;
+    let end = performance.now();
+
+    this._results.push({
+      name: "console.bulklog",
+      value: end - start
+    });
+
+    yield this.closeToolbox(null);
+    yield this.testTeardown();
+  }),
+
   takeCensus: function(label) {
     let start = performance.now();
 
     this._snapshot.takeCensus({
       breakdown: {
         by: "coarseType",
         objects: {
           by: "objectClass",
@@ -218,20 +267,21 @@ Damp.prototype = {
         sequenceArray.push(subtests[config.subtests[i]]);
       }
     }
 
     return sequenceArray;
   },
 
   testSetup: Task.async(function*(url) {
-    yield this.addTab(url);
+    let tab = yield this.addTab(url);
     yield new Promise(resolve => {
       setTimeout(resolve, this._config.rest);
     });
+    return tab;
   }),
 
   testTeardown: Task.async(function*(url) {
     this.closeCurrentTab();
     this._nextCommand();
   }),
 
   // Everything below here are common pieces needed for the test runner to function,
@@ -321,11 +371,15 @@ Damp.prototype = {
     this._dampTab = this._win.gBrowser.selectedTab;
     this._win.gBrowser.selectedBrowser.focus(); // Unfocus the URL bar to avoid caret blink
 
     Profiler.mark("DAMP - start", true);
 
     let tests = [];
     tests = tests.concat(this._getToolLoadingTests(SIMPLE_URL, "simple"));
     tests = tests.concat(this._getToolLoadingTests(COMPLICATED_URL, "complicated"));
+
+    if (config.subtests.indexOf("consoleBulkLogging") > -1) {
+      tests = tests.concat(this._consoleBulkLoggingTest);
+    }
     this._doSequence(tests, this._doneInternal);
   }
 }