Bug 1307940 - Add mocha tests to test logged node grips handling; r=jdescottes draft
authorNicolas Chevobbe <chevobbe.nicolas@gmail.com>
Fri, 27 Jan 2017 21:47:01 +0100
changeset 498746 b04899ecedd13ebce3b1225e4f030c1f906e7b07
parent 498745 b95ca91e3a807903610fab621ff488307c14e4d4
child 549238 e3b6e615014bad2f8781f4bc5c0486a3270524d2
push id49293
push userchevobbe.nicolas@gmail.com
push dateWed, 15 Mar 2017 07:58:16 +0000
reviewersjdescottes
bugs1307940
milestone55.0a1
Bug 1307940 - Add mocha tests to test logged node grips handling; r=jdescottes Add some stubs to test nodes in diferent types (object, array, set, map, ...). Test ConsoleMessage and EvaluationResult components. Test getNodeGripsFromMessage util function. MozReview-Commit-ID: 2rigcaWPlX2
devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js
devtools/client/webconsole/new-console-output/test/components/evaluation-result.test.js
devtools/client/webconsole/new-console-output/test/fixtures/serviceContainer.js
devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js
devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
devtools/client/webconsole/new-console-output/test/utils/messages.test.js
--- a/devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js
+++ b/devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js
@@ -1,17 +1,20 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 "use strict";
 
 // Test utils.
 const expect = require("expect");
 const { render, mount } = require("enzyme");
 const sinon = require("sinon");
-
+const Immutable = require("devtools/client/shared/vendor/immutable");
+const {
+  getNodeGripsFromMessage
+} = require("devtools/client/webconsole/new-console-output/utils/messages");
 // React
 const { createFactory } = require("devtools/client/shared/vendor/react");
 const Provider = createFactory(require("react-redux").Provider);
 const { setupStore } = require("devtools/client/webconsole/new-console-output/test/helpers");
 
 // Components under test.
 const ConsoleApiCall = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/console-api-call"));
 const {
@@ -95,16 +98,61 @@ describe("ConsoleAPICall component:", ()
     it("renders a timestamp", () => {
       const message = stubPreparedMessages.get("console.log('foobar', 'test')");
       const wrapper = render(ConsoleApiCall({ message, serviceContainer }));
       const L10n = require("devtools/client/webconsole/new-console-output/test/fixtures/L10n");
       const { timestampString } = new L10n();
 
       expect(wrapper.find(".timestamp").text()).toBe(timestampString(message.timeStamp));
     });
+
+    it("renders open-in-inspector icons for node grips", () => {
+      const message = stubPreparedMessages.get(
+        "console.log(document.querySelectorAll('*'))");
+
+      // Building a fake nodeFronts map, with as many element as there are node grips
+      // logged in the message.
+      const nodeGrips = getNodeGripsFromMessage(message);
+      const nodeFronts = message.parameters.reduce((res, parameter) => (
+        nodeGrips.reduce((frontMap, grip) =>
+          frontMap.set(grip.actor, true), res)
+        ), Immutable.Map());
+
+      serviceContainer.openNodeInInspector = sinon.spy();
+
+      const store = setupStore([]);
+      let wrapper = mount(Provider({store}, ConsoleApiCall({
+        message,
+        serviceContainer,
+        nodeFronts
+      })));
+
+      let icons = wrapper.find(".open-inspector");
+      expect(icons.length).toBe(7);
+
+      icons.forEach((icon, index) => {
+        icon.simulate("click");
+        let call = serviceContainer.openNodeInInspector.getCall(index);
+        let grip = nodeGrips[index];
+        expect(call.args[0]).toEqual(grip);
+      });
+
+    });
+
+    it("doesn't renders open-in-inspector icons if nodeFronts is empty", () => {
+      const message = stubPreparedMessages.get(
+        "console.log(document.querySelectorAll('*'))");
+      const wrapper = render(ConsoleApiCall({
+        message,
+        serviceContainer
+      }));
+
+      let icons = wrapper.find(".open-inspector");
+      expect(icons.length).toBe(0);
+    });
   });
 
   describe("console.count", () => {
     it("renders", () => {
       const message = stubPreparedMessages.get("console.count('bar')");
       const wrapper = render(ConsoleApiCall({ message, serviceContainer }));
 
       expect(wrapper.find(".message-body").text()).toBe("bar: 1");
--- a/devtools/client/webconsole/new-console-output/test/components/evaluation-result.test.js
+++ b/devtools/client/webconsole/new-console-output/test/components/evaluation-result.test.js
@@ -1,16 +1,20 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 "use strict";
 
 // Test utils.
 const expect = require("expect");
 const { render, mount } = require("enzyme");
 const sinon = require("sinon");
+const Immutable = require("devtools/client/shared/vendor/immutable");
+const {
+  getNodeGripsFromMessage
+} = require("devtools/client/webconsole/new-console-output/utils/messages");
 
 // React
 const { createFactory } = require("devtools/client/shared/vendor/react");
 const Provider = createFactory(require("react-redux").Provider);
 const { setupStore } = require("devtools/client/webconsole/new-console-output/test/helpers");
 
 // Components under test.
 const EvaluationResult = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/evaluation-result"));
@@ -85,9 +89,50 @@ describe("EvaluationResult component:", 
   it("has a timestamp", () => {
     const message = stubPreparedMessages.get("new Date(0)");
     const wrapper = render(EvaluationResult({ message }));
     const L10n = require("devtools/client/webconsole/new-console-output/test/fixtures/L10n");
     const { timestampString } = new L10n();
 
     expect(wrapper.find(".timestamp").text()).toBe(timestampString(message.timeStamp));
   });
+
+  it("renders open-in-inspector icons for node grips", () => {
+    const message = stubPreparedMessages.get("document.querySelectorAll('*')");
+
+    const store = setupStore([]);
+
+    // Building a fake nodeFronts map, with as many element as there are node grips
+    // logged in the message.
+    const nodeGrips = getNodeGripsFromMessage(message);
+    const nodeFronts = nodeGrips.reduce((frontMap, grip) => {
+      return frontMap.set(grip.actor, true);
+    } , Immutable.Map());
+
+    serviceContainer.openNodeInInspector = sinon.spy();
+    const wrapper = mount(Provider({store}, EvaluationResult({
+      message,
+      serviceContainer,
+      nodeFronts
+    })));
+
+    let icons = wrapper.find(".open-inspector");
+    expect(icons.length).toBe(3);
+
+    icons.forEach((icon, index) => {
+      icon.simulate("click");
+      let call = serviceContainer.openNodeInInspector.getCall(index);
+      let grip = nodeGrips[index];
+      expect(call.args[0]).toEqual(grip);
+    });
+  });
+
+  it("doesn't renders open-in-inspector icons if nodeFronts is empty", () => {
+    const message = stubPreparedMessages.get("document.querySelectorAll('*')");
+    const wrapper = render(EvaluationResult({
+      message,
+      serviceContainer
+    }));
+
+    let icons = wrapper.find(".open-inspector");
+    expect(icons.length).toBe(0);
+  });
 });
--- a/devtools/client/webconsole/new-console-output/test/fixtures/serviceContainer.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/serviceContainer.js
@@ -6,15 +6,16 @@
 module.exports = {
   attachRefToHud: () => {},
   emitNewMessage: () => {},
   hudProxyClient: {},
   onViewSourceInDebugger: () => {},
   onViewSourceInStyleEditor: () => {},
   onViewSourceInScratchpad: () => {},
   openNetworkPanel: () => {},
+  openNodeInInspector: () => {},
   sourceMapService: {
     subscribe: () => {},
   },
   openLink: () => {},
   // eslint-disable-next-line react/display-name
   createElement: tagName => document.createElement(tagName)
 };
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js
@@ -13,16 +13,25 @@ const consoleApiCommands = [
   "console.log(null)",
   "console.log('\u9f2c')",
   "console.clear()",
   "console.count('bar')",
   "console.assert(false, {message: 'foobar'})",
   "console.log('hello \\nfrom \\rthe \\\"string world!')",
   "console.log('\xFA\u1E47\u0129\xE7\xF6d\xEA \u021B\u0115\u0219\u0165')",
   "console.dirxml(window)",
+  "console.log(document.querySelectorAll('*'))",
+  "console.log(document.querySelector('*'))",
+  "console.log(...document.querySelectorAll('*'))",
+  "console.log([...document.querySelectorAll('*')])",
+  "console.log({node: document.querySelector('*')})",
+  "console.log(new Map([['node', document.querySelector('*')]]))",
+  "console.log(new Map([[document.querySelector('*'), 'node']]))",
+  "console.log(new Set([...document.querySelectorAll('*')]))",
+  "console.log(document.querySelector('p').firstChild)",
 ];
 
 let consoleApi = new Map(consoleApiCommands.map(
   cmd => [cmd, {keys: [cmd], code: cmd}]));
 
 consoleApi.set("console.trace()", {
   keys: ["console.trace()"],
   code: `
@@ -99,17 +108,24 @@ p {
   padding-top: invalid value;
 }
 `);
 
 // Evaluation Result
 const evaluationResultCommands = [
   "new Date(0)",
   "asdf()",
-  "1 + @"
+  "1 + @",
+  "document.querySelectorAll('*')",
+  "document.querySelector('*')",
+  "[...document.querySelectorAll('*')]",
+  "x = {node: document.querySelector('*')}",
+  "new Map([['node', document.querySelector('*')]])",
+  "new Map([[document.querySelector('*'), 'node']])",
+  "new Set([...document.querySelectorAll('*')])",
 ];
 
 let evaluationResult = new Map(evaluationResultCommands.map(cmd => [cmd, cmd]));
 
 // Network Event
 
 let networkEvent = new Map();
 
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
@@ -354,16 +354,885 @@ stubPreparedMessages.set("console.dirxml
     "column": 27
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null
 }));
 
+stubPreparedMessages.set("console.log(document.querySelectorAll('*'))", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1488040786991,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj33",
+      "class": "NodeList",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 7,
+      "preview": {
+        "kind": "ArrayLike",
+        "length": 7,
+        "items": [
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj34",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {
+                "lang": "en"
+              },
+              "attributesLength": 1
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj35",
+            "class": "HTMLHeadElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "head",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj36",
+            "class": "HTMLMetaElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "meta",
+              "attributes": {
+                "charset": "utf-8"
+              },
+              "attributesLength": 1
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj37",
+            "class": "HTMLTitleElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "title",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj38",
+            "class": "HTMLBodyElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "body",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj39",
+            "class": "HTMLParagraphElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "p",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj40",
+            "class": "HTMLScriptElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "script",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          }
+        ]
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1488040786991,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj33\",\"class\":\"NodeList\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":7,\"preview\":{\"kind\":\"ArrayLike\",\"length\":7,\"items\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj34\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{\"lang\":\"en\"},\"attributesLength\":1}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj35\",\"class\":\"HTMLHeadElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"head\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj36\",\"class\":\"HTMLMetaElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"meta\",\"attributes\":{\"charset\":\"utf-8\"},\"attributesLength\":1}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj37\",\"class\":\"HTMLTitleElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"title\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj38\",\"class\":\"HTMLBodyElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"body\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj39\",\"class\":\"HTMLParagraphElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"p\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj40\",\"class\":\"HTMLScriptElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"script\",\"attributes\":{},\"attributesLength\":0}}]}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 27
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("console.log(document.querySelector('*'))", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1489096178339,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj41",
+      "class": "HTMLHtmlElement",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 1,
+        "nodeName": "html",
+        "attributes": {
+          "lang": "en"
+        },
+        "attributesLength": 1
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1489096178339,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj41\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{\"lang\":\"en\"},\"attributesLength\":1}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 27
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("console.log(...document.querySelectorAll('*'))", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1489096178352,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj42",
+      "class": "HTMLHtmlElement",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 1,
+        "nodeName": "html",
+        "attributes": {
+          "lang": "en"
+        },
+        "attributesLength": 1
+      }
+    },
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj43",
+      "class": "HTMLHeadElement",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 1,
+        "nodeName": "head",
+        "attributes": {},
+        "attributesLength": 0
+      }
+    },
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj44",
+      "class": "HTMLMetaElement",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 1,
+        "nodeName": "meta",
+        "attributes": {
+          "charset": "utf-8"
+        },
+        "attributesLength": 1
+      }
+    },
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj45",
+      "class": "HTMLTitleElement",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 1,
+        "nodeName": "title",
+        "attributes": {},
+        "attributesLength": 0
+      }
+    },
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj46",
+      "class": "HTMLBodyElement",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 1,
+        "nodeName": "body",
+        "attributes": {},
+        "attributesLength": 0
+      }
+    },
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj47",
+      "class": "HTMLParagraphElement",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 1,
+        "nodeName": "p",
+        "attributes": {},
+        "attributesLength": 0
+      }
+    },
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj48",
+      "class": "HTMLScriptElement",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 1,
+        "nodeName": "script",
+        "attributes": {},
+        "attributesLength": 0
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1489096178352,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj42\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{\"lang\":\"en\"},\"attributesLength\":1}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj43\",\"class\":\"HTMLHeadElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"head\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj44\",\"class\":\"HTMLMetaElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"meta\",\"attributes\":{\"charset\":\"utf-8\"},\"attributesLength\":1}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj45\",\"class\":\"HTMLTitleElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"title\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj46\",\"class\":\"HTMLBodyElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"body\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj47\",\"class\":\"HTMLParagraphElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"p\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj48\",\"class\":\"HTMLScriptElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"script\",\"attributes\":{},\"attributesLength\":0}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":42},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 42
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("console.log([...document.querySelectorAll('*')])", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1489097145460,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj49",
+      "class": "Array",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 8,
+      "preview": {
+        "kind": "ArrayLike",
+        "length": 7,
+        "items": [
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj52",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {
+                "lang": "en"
+              },
+              "attributesLength": 1
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj53",
+            "class": "HTMLHeadElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "head",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj54",
+            "class": "HTMLMetaElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "meta",
+              "attributes": {
+                "charset": "utf-8"
+              },
+              "attributesLength": 1
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj55",
+            "class": "HTMLTitleElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "title",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj56",
+            "class": "HTMLBodyElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "body",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj57",
+            "class": "HTMLParagraphElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "p",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj58",
+            "class": "HTMLScriptElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "script",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          }
+        ]
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1489097145460,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj49\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":8,\"preview\":{\"kind\":\"ArrayLike\",\"length\":7,\"items\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj52\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{\"lang\":\"en\"},\"attributesLength\":1}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj53\",\"class\":\"HTMLHeadElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"head\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj54\",\"class\":\"HTMLMetaElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"meta\",\"attributes\":{\"charset\":\"utf-8\"},\"attributesLength\":1}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj55\",\"class\":\"HTMLTitleElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"title\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj56\",\"class\":\"HTMLBodyElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"body\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj57\",\"class\":\"HTMLParagraphElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"p\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj58\",\"class\":\"HTMLScriptElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"script\",\"attributes\":{},\"attributesLength\":0}}]}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 27
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("console.log({node: document.querySelector('*')})", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1489330685274,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj60",
+      "class": "Object",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 1,
+      "preview": {
+        "kind": "Object",
+        "ownProperties": {
+          "node": {
+            "configurable": true,
+            "enumerable": true,
+            "writable": true,
+            "value": {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj61",
+              "class": "HTMLHtmlElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "html",
+                "attributes": {
+                  "lang": "en"
+                },
+                "attributesLength": 1
+              }
+            }
+          }
+        },
+        "ownPropertiesLength": 1,
+        "safeGetterValues": {}
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1489330685274,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj60\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"node\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj61\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{\"lang\":\"en\"},\"attributesLength\":1}}}},\"ownPropertiesLength\":1,\"safeGetterValues\":{}}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 27
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("console.log(new Map([['node', document.querySelector('*')]]))", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1489096178374,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj51",
+      "class": "Map",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "MapLike",
+        "size": 1,
+        "entries": [
+          [
+            "node",
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj71",
+              "class": "HTMLHtmlElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "html",
+                "attributes": {
+                  "lang": "en"
+                },
+                "attributesLength": 1
+              }
+            }
+          ]
+        ]
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1489096178374,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj51\",\"class\":\"Map\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"MapLike\",\"size\":1,\"entries\":[[\"node\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj71\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{\"lang\":\"en\"},\"attributesLength\":1}}]]}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 27
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("console.log(new Map([[document.querySelector('*'), 'node']]))", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1489096179161,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj55",
+      "class": "Map",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "MapLike",
+        "size": 1,
+        "entries": [
+          [
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj73",
+              "class": "HTMLHtmlElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "html",
+                "attributes": {
+                  "lang": "en"
+                },
+                "attributesLength": 1
+              }
+            },
+            "node"
+          ]
+        ]
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1489096179161,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj55\",\"class\":\"Map\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"MapLike\",\"size\":1,\"entries\":[[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj73\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{\"lang\":\"en\"},\"attributesLength\":1}},\"node\"]]}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 27
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("console.log(new Set([...document.querySelectorAll('*')]))", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1489096179201,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj58",
+      "class": "Set",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "ArrayLike",
+        "length": 7,
+        "items": [
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj75",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {
+                "lang": "en"
+              },
+              "attributesLength": 1
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj76",
+            "class": "HTMLHeadElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "head",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj77",
+            "class": "HTMLMetaElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "meta",
+              "attributes": {
+                "charset": "utf-8"
+              },
+              "attributesLength": 1
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj78",
+            "class": "HTMLTitleElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "title",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj79",
+            "class": "HTMLBodyElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "body",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj80",
+            "class": "HTMLParagraphElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "p",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj81",
+            "class": "HTMLScriptElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "script",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          }
+        ]
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1489096179201,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj58\",\"class\":\"Set\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"ArrayLike\",\"length\":7,\"items\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj75\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{\"lang\":\"en\"},\"attributesLength\":1}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj76\",\"class\":\"HTMLHeadElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"head\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj77\",\"class\":\"HTMLMetaElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"meta\",\"attributes\":{\"charset\":\"utf-8\"},\"attributesLength\":1}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj78\",\"class\":\"HTMLTitleElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"title\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj79\",\"class\":\"HTMLBodyElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"body\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj80\",\"class\":\"HTMLParagraphElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"p\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj81\",\"class\":\"HTMLScriptElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"script\",\"attributes\":{},\"attributesLength\":0}}]}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 27
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("console.log(document.querySelector('p').firstChild)", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1489096180541,
+  "type": "log",
+  "level": "log",
+  "messageText": null,
+  "parameters": [
+    {
+      "type": "object",
+      "actor": "server1.conn0.child1/obj75",
+      "class": "Text",
+      "extensible": true,
+      "frozen": false,
+      "sealed": false,
+      "ownPropertyLength": 0,
+      "preview": {
+        "kind": "DOMNode",
+        "nodeType": 3,
+        "nodeName": "#text",
+        "textContent": "Stub generator"
+      }
+    }
+  ],
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":1489096180541,\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj75\",\"class\":\"Text\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":3,\"nodeName\":\"#text\",\"textContent\":\"Stub generator\"}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 1,
+    "column": 27
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
 stubPreparedMessages.set("console.trace()", new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1479159910198,
   "type": "trace",
   "level": "log",
   "messageText": null,
@@ -1017,16 +1886,867 @@ stubPackets.set("console.dirxml(window)"
     "timeStamp": 1479159908948,
     "timer": null,
     "workerType": "none",
     "styles": [],
     "category": "webdev"
   }
 });
 
+stubPackets.set("console.log(document.querySelectorAll('*'))", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj33",
+        "class": "NodeList",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 7,
+        "preview": {
+          "kind": "ArrayLike",
+          "length": 7,
+          "items": [
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj34",
+              "class": "HTMLHtmlElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "html",
+                "attributes": {
+                  "lang": "en"
+                },
+                "attributesLength": 1
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj35",
+              "class": "HTMLHeadElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "head",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj36",
+              "class": "HTMLMetaElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "meta",
+                "attributes": {
+                  "charset": "utf-8"
+                },
+                "attributesLength": 1
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj37",
+              "class": "HTMLTitleElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "title",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj38",
+              "class": "HTMLBodyElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "body",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj39",
+              "class": "HTMLParagraphElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "p",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj40",
+              "class": "HTMLScriptElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "script",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            }
+          ]
+        }
+      }
+    ],
+    "columnNumber": 27,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1488040786991,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
+stubPackets.set("console.log(document.querySelector('*'))", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj41",
+        "class": "HTMLHtmlElement",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 1,
+          "nodeName": "html",
+          "attributes": {
+            "lang": "en"
+          },
+          "attributesLength": 1
+        }
+      }
+    ],
+    "columnNumber": 27,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1489096178339,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
+stubPackets.set("console.log(...document.querySelectorAll('*'))", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj42",
+        "class": "HTMLHtmlElement",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 1,
+          "nodeName": "html",
+          "attributes": {
+            "lang": "en"
+          },
+          "attributesLength": 1
+        }
+      },
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj43",
+        "class": "HTMLHeadElement",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 1,
+          "nodeName": "head",
+          "attributes": {},
+          "attributesLength": 0
+        }
+      },
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj44",
+        "class": "HTMLMetaElement",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 1,
+          "nodeName": "meta",
+          "attributes": {
+            "charset": "utf-8"
+          },
+          "attributesLength": 1
+        }
+      },
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj45",
+        "class": "HTMLTitleElement",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 1,
+          "nodeName": "title",
+          "attributes": {},
+          "attributesLength": 0
+        }
+      },
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj46",
+        "class": "HTMLBodyElement",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 1,
+          "nodeName": "body",
+          "attributes": {},
+          "attributesLength": 0
+        }
+      },
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj47",
+        "class": "HTMLParagraphElement",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 1,
+          "nodeName": "p",
+          "attributes": {},
+          "attributesLength": 0
+        }
+      },
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj48",
+        "class": "HTMLScriptElement",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 1,
+          "nodeName": "script",
+          "attributes": {},
+          "attributesLength": 0
+        }
+      }
+    ],
+    "columnNumber": 42,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1489096178352,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
+stubPackets.set("console.log([...document.querySelectorAll('*')])", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj49",
+        "class": "Array",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 8,
+        "preview": {
+          "kind": "ArrayLike",
+          "length": 7,
+          "items": [
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj52",
+              "class": "HTMLHtmlElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "html",
+                "attributes": {
+                  "lang": "en"
+                },
+                "attributesLength": 1
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj53",
+              "class": "HTMLHeadElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "head",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj54",
+              "class": "HTMLMetaElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "meta",
+                "attributes": {
+                  "charset": "utf-8"
+                },
+                "attributesLength": 1
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj55",
+              "class": "HTMLTitleElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "title",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj56",
+              "class": "HTMLBodyElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "body",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj57",
+              "class": "HTMLParagraphElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "p",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj58",
+              "class": "HTMLScriptElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "script",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            }
+          ]
+        }
+      }
+    ],
+    "columnNumber": 27,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1489097145460,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
+stubPackets.set("console.log({node: document.querySelector('*')})", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj60",
+        "class": "Object",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 1,
+        "preview": {
+          "kind": "Object",
+          "ownProperties": {
+            "node": {
+              "configurable": true,
+              "enumerable": true,
+              "writable": true,
+              "value": {
+                "type": "object",
+                "actor": "server1.conn0.child1/obj61",
+                "class": "HTMLHtmlElement",
+                "extensible": true,
+                "frozen": false,
+                "sealed": false,
+                "ownPropertyLength": 0,
+                "preview": {
+                  "kind": "DOMNode",
+                  "nodeType": 1,
+                  "nodeName": "html",
+                  "attributes": {
+                    "lang": "en"
+                  },
+                  "attributesLength": 1
+                }
+              }
+            }
+          },
+          "ownPropertiesLength": 1,
+          "safeGetterValues": {}
+        }
+      }
+    ],
+    "columnNumber": 27,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1489330685274,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
+stubPackets.set("console.log(new Map([['node', document.querySelector('*')]]))", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj51",
+        "class": "Map",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "MapLike",
+          "size": 1,
+          "entries": [
+            [
+              "node",
+              {
+                "type": "object",
+                "actor": "server1.conn0.child1/obj71",
+                "class": "HTMLHtmlElement",
+                "extensible": true,
+                "frozen": false,
+                "sealed": false,
+                "ownPropertyLength": 0,
+                "preview": {
+                  "kind": "DOMNode",
+                  "nodeType": 1,
+                  "nodeName": "html",
+                  "attributes": {
+                    "lang": "en"
+                  },
+                  "attributesLength": 1
+                }
+              }
+            ]
+          ]
+        }
+      }
+    ],
+    "columnNumber": 27,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1489096178374,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
+stubPackets.set("console.log(new Map([[document.querySelector('*'), 'node']]))", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj55",
+        "class": "Map",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "MapLike",
+          "size": 1,
+          "entries": [
+            [
+              {
+                "type": "object",
+                "actor": "server1.conn0.child1/obj73",
+                "class": "HTMLHtmlElement",
+                "extensible": true,
+                "frozen": false,
+                "sealed": false,
+                "ownPropertyLength": 0,
+                "preview": {
+                  "kind": "DOMNode",
+                  "nodeType": 1,
+                  "nodeName": "html",
+                  "attributes": {
+                    "lang": "en"
+                  },
+                  "attributesLength": 1
+                }
+              },
+              "node"
+            ]
+          ]
+        }
+      }
+    ],
+    "columnNumber": 27,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1489096179161,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
+stubPackets.set("console.log(new Set([...document.querySelectorAll('*')]))", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj58",
+        "class": "Set",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "ArrayLike",
+          "length": 7,
+          "items": [
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj75",
+              "class": "HTMLHtmlElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "html",
+                "attributes": {
+                  "lang": "en"
+                },
+                "attributesLength": 1
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj76",
+              "class": "HTMLHeadElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "head",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj77",
+              "class": "HTMLMetaElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "meta",
+                "attributes": {
+                  "charset": "utf-8"
+                },
+                "attributesLength": 1
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj78",
+              "class": "HTMLTitleElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "title",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj79",
+              "class": "HTMLBodyElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "body",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj80",
+              "class": "HTMLParagraphElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "p",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            },
+            {
+              "type": "object",
+              "actor": "server1.conn0.child1/obj81",
+              "class": "HTMLScriptElement",
+              "extensible": true,
+              "frozen": false,
+              "sealed": false,
+              "ownPropertyLength": 0,
+              "preview": {
+                "kind": "DOMNode",
+                "nodeType": 1,
+                "nodeName": "script",
+                "attributes": {},
+                "attributesLength": 0
+              }
+            }
+          ]
+        }
+      }
+    ],
+    "columnNumber": 27,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1489096179201,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
+stubPackets.set("console.log(document.querySelector('p').firstChild)", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "arguments": [
+      {
+        "type": "object",
+        "actor": "server1.conn0.child1/obj75",
+        "class": "Text",
+        "extensible": true,
+        "frozen": false,
+        "sealed": false,
+        "ownPropertyLength": 0,
+        "preview": {
+          "kind": "DOMNode",
+          "nodeType": 3,
+          "nodeName": "#text",
+          "textContent": "Stub generator"
+        }
+      }
+    ],
+    "columnNumber": 27,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "log",
+    "lineNumber": 1,
+    "private": false,
+    "styles": [],
+    "timeStamp": 1489096180541,
+    "timer": null,
+    "workerType": "none",
+    "category": "webdev"
+  }
+});
+
 stubPackets.set("console.trace()", {
   "from": "server1.conn12.child1/consoleActor2",
   "type": "consoleAPICall",
   "message": {
     "addonId": "",
     "arguments": [],
     "columnNumber": 3,
     "counter": null,
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
@@ -85,16 +85,438 @@ stubPreparedMessages.set("1 + @", new Co
     "line": 1,
     "column": 4
   },
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null
 }));
 
+stubPreparedMessages.set("document.querySelectorAll('*')", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "javascript",
+  "timeStamp": 1488040795104,
+  "type": "result",
+  "level": "log",
+  "parameters": {
+    "type": "object",
+    "actor": "server1.conn2.child1/obj36",
+    "class": "NodeList",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 3,
+    "preview": {
+      "kind": "ArrayLike",
+      "length": 3,
+      "items": [
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj37",
+          "class": "HTMLHtmlElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "html",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj38",
+          "class": "HTMLHeadElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "head",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj39",
+          "class": "HTMLBodyElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "body",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        }
+      ]
+    }
+  },
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1488040795104,\"type\":\"result\",\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn2.child1/obj36\",\"class\":\"NodeList\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":3,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj37\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj38\",\"class\":\"HTMLHeadElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"head\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj39\",\"class\":\"HTMLBodyElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"body\",\"attributes\":{},\"attributesLength\":0}}]}},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"userProvidedStyles\":null,\"notes\":null}",
+  "stacktrace": null,
+  "frame": null,
+  "groupId": null,
+  "userProvidedStyles": null,
+  "notes": null
+}));
+
+stubPreparedMessages.set("document.querySelector('*')", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "javascript",
+  "timeStamp": 1489096917959,
+  "type": "result",
+  "level": "log",
+  "parameters": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj41",
+    "class": "HTMLHtmlElement",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 0,
+    "preview": {
+      "kind": "DOMNode",
+      "nodeType": 1,
+      "nodeName": "html",
+      "attributes": {},
+      "attributesLength": 0
+    }
+  },
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1489096917959,\"type\":\"result\",\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj41\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{},\"attributesLength\":0}},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"userProvidedStyles\":null,\"notes\":null}",
+  "stacktrace": null,
+  "frame": null,
+  "groupId": null,
+  "userProvidedStyles": null,
+  "notes": null
+}));
+
+stubPreparedMessages.set("[...document.querySelectorAll('*')]", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "javascript",
+  "timeStamp": 1489097106864,
+  "type": "result",
+  "level": "log",
+  "parameters": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj43",
+    "class": "Array",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 4,
+    "preview": {
+      "kind": "ArrayLike",
+      "length": 3,
+      "items": [
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj44",
+          "class": "HTMLHtmlElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "html",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj45",
+          "class": "HTMLHeadElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "head",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj46",
+          "class": "HTMLBodyElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "body",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        }
+      ]
+    }
+  },
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1489097106864,\"type\":\"result\",\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj43\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj44\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj45\",\"class\":\"HTMLHeadElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"head\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj46\",\"class\":\"HTMLBodyElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"body\",\"attributes\":{},\"attributesLength\":0}}]}},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"userProvidedStyles\":null,\"notes\":null}",
+  "stacktrace": null,
+  "frame": null,
+  "groupId": null,
+  "userProvidedStyles": null,
+  "notes": null
+}));
+
+stubPreparedMessages.set("x = {node: document.querySelector('*')}", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "javascript",
+  "timeStamp": 1489097452269,
+  "type": "result",
+  "level": "log",
+  "parameters": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj48",
+    "class": "Object",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 1,
+    "preview": {
+      "kind": "Object",
+      "ownProperties": {
+        "node": {
+          "configurable": true,
+          "enumerable": true,
+          "writable": true,
+          "value": {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj49",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          }
+        }
+      },
+      "ownPropertiesLength": 1,
+      "safeGetterValues": {}
+    }
+  },
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1489097452269,\"type\":\"result\",\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj48\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"node\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj49\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{},\"attributesLength\":0}}}},\"ownPropertiesLength\":1,\"safeGetterValues\":{}}},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"userProvidedStyles\":null,\"notes\":null}",
+  "stacktrace": null,
+  "frame": null,
+  "groupId": null,
+  "userProvidedStyles": null,
+  "notes": null
+}));
+
+stubPreparedMessages.set("new Map([['node', document.querySelector('*')]])", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "javascript",
+  "timeStamp": 1489096918008,
+  "type": "result",
+  "level": "log",
+  "parameters": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj49",
+    "class": "Map",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 0,
+    "preview": {
+      "kind": "MapLike",
+      "size": 1,
+      "entries": [
+        [
+          "node",
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj52",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          }
+        ]
+      ]
+    }
+  },
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1489096918008,\"type\":\"result\",\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj49\",\"class\":\"Map\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"MapLike\",\"size\":1,\"entries\":[[\"node\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj52\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{},\"attributesLength\":0}}]]}},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"userProvidedStyles\":null,\"notes\":null}",
+  "stacktrace": null,
+  "frame": null,
+  "groupId": null,
+  "userProvidedStyles": null,
+  "notes": null
+}));
+
+stubPreparedMessages.set("new Map([[document.querySelector('*'), 'node']])", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "javascript",
+  "timeStamp": 1489096918028,
+  "type": "result",
+  "level": "log",
+  "parameters": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj52",
+    "class": "Map",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 0,
+    "preview": {
+      "kind": "MapLike",
+      "size": 1,
+      "entries": [
+        [
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj55",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          "node"
+        ]
+      ]
+    }
+  },
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1489096918028,\"type\":\"result\",\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj52\",\"class\":\"Map\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"MapLike\",\"size\":1,\"entries\":[[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj55\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{},\"attributesLength\":0}},\"node\"]]}},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"userProvidedStyles\":null,\"notes\":null}",
+  "stacktrace": null,
+  "frame": null,
+  "groupId": null,
+  "userProvidedStyles": null,
+  "notes": null
+}));
+
+stubPreparedMessages.set("new Set([...document.querySelectorAll('*')])", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "javascript",
+  "timeStamp": 1489096918039,
+  "type": "result",
+  "level": "log",
+  "parameters": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj55",
+    "class": "Set",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 0,
+    "preview": {
+      "kind": "ArrayLike",
+      "length": 3,
+      "items": [
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj58",
+          "class": "HTMLHtmlElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "html",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj59",
+          "class": "HTMLHeadElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "head",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj60",
+          "class": "HTMLBodyElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "body",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        }
+      ]
+    }
+  },
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1489096918039,\"type\":\"result\",\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj55\",\"class\":\"Set\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj58\",\"class\":\"HTMLHtmlElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"html\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj59\",\"class\":\"HTMLHeadElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"head\",\"attributes\":{},\"attributesLength\":0}},{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj60\",\"class\":\"HTMLBodyElement\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"DOMNode\",\"nodeType\":1,\"nodeName\":\"body\",\"attributes\":{},\"attributesLength\":0}}]}},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"userProvidedStyles\":null,\"notes\":null}",
+  "stacktrace": null,
+  "frame": null,
+  "groupId": null,
+  "userProvidedStyles": null,
+  "notes": null
+}));
+
 stubPackets.set("new Date(0)", {
   "from": "server1.conn0.child1/consoleActor2",
   "input": "new Date(0)",
   "result": {
     "type": "object",
     "actor": "server1.conn0.child1/obj30",
     "class": "Date",
     "extensible": true,
@@ -178,12 +600,392 @@ stubPackets.set("1 + @", {
     "source": "debugger eval code",
     "line": 1,
     "column": 4
   },
   "helperResult": null,
   "notes": null
 });
 
+stubPackets.set("document.querySelectorAll('*')", {
+  "from": "server1.conn2.child1/consoleActor2",
+  "input": "document.querySelectorAll('*')",
+  "result": {
+    "type": "object",
+    "actor": "server1.conn2.child1/obj36",
+    "class": "NodeList",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 3,
+    "preview": {
+      "kind": "ArrayLike",
+      "length": 3,
+      "items": [
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj37",
+          "class": "HTMLHtmlElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "html",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj38",
+          "class": "HTMLHeadElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "head",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj39",
+          "class": "HTMLBodyElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "body",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        }
+      ]
+    }
+  },
+  "timestamp": 1488040795104,
+  "exception": null,
+  "frame": null,
+  "helperResult": null,
+  "notes": null
+});
+
+stubPackets.set("document.querySelector('*')", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "input": "document.querySelector('*')",
+  "result": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj41",
+    "class": "HTMLHtmlElement",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 0,
+    "preview": {
+      "kind": "DOMNode",
+      "nodeType": 1,
+      "nodeName": "html",
+      "attributes": {},
+      "attributesLength": 0
+    }
+  },
+  "timestamp": 1489096917959,
+  "exception": null,
+  "frame": null,
+  "helperResult": null,
+  "notes": null
+});
+
+stubPackets.set("[...document.querySelectorAll('*')]", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "input": "[...document.querySelectorAll('*')]",
+  "result": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj43",
+    "class": "Array",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 4,
+    "preview": {
+      "kind": "ArrayLike",
+      "length": 3,
+      "items": [
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj44",
+          "class": "HTMLHtmlElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "html",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj45",
+          "class": "HTMLHeadElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "head",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj46",
+          "class": "HTMLBodyElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "body",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        }
+      ]
+    }
+  },
+  "timestamp": 1489097106864,
+  "exception": null,
+  "frame": null,
+  "helperResult": null,
+  "notes": null
+});
+
+stubPackets.set("x = {node: document.querySelector('*')}", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "input": "x = {node: document.querySelector('*')}",
+  "result": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj48",
+    "class": "Object",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 1,
+    "preview": {
+      "kind": "Object",
+      "ownProperties": {
+        "node": {
+          "configurable": true,
+          "enumerable": true,
+          "writable": true,
+          "value": {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj49",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          }
+        }
+      },
+      "ownPropertiesLength": 1,
+      "safeGetterValues": {}
+    }
+  },
+  "timestamp": 1489097452269,
+  "exception": null,
+  "frame": null,
+  "helperResult": null,
+  "notes": null
+});
+
+stubPackets.set("new Map([['node', document.querySelector('*')]])", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "input": "new Map([['node', document.querySelector('*')]])",
+  "result": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj49",
+    "class": "Map",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 0,
+    "preview": {
+      "kind": "MapLike",
+      "size": 1,
+      "entries": [
+        [
+          "node",
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj52",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          }
+        ]
+      ]
+    }
+  },
+  "timestamp": 1489096918008,
+  "exception": null,
+  "frame": null,
+  "helperResult": null,
+  "notes": null
+});
+
+stubPackets.set("new Map([[document.querySelector('*'), 'node']])", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "input": "new Map([[document.querySelector('*'), 'node']])",
+  "result": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj52",
+    "class": "Map",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 0,
+    "preview": {
+      "kind": "MapLike",
+      "size": 1,
+      "entries": [
+        [
+          {
+            "type": "object",
+            "actor": "server1.conn0.child1/obj55",
+            "class": "HTMLHtmlElement",
+            "extensible": true,
+            "frozen": false,
+            "sealed": false,
+            "ownPropertyLength": 0,
+            "preview": {
+              "kind": "DOMNode",
+              "nodeType": 1,
+              "nodeName": "html",
+              "attributes": {},
+              "attributesLength": 0
+            }
+          },
+          "node"
+        ]
+      ]
+    }
+  },
+  "timestamp": 1489096918028,
+  "exception": null,
+  "frame": null,
+  "helperResult": null,
+  "notes": null
+});
+
+stubPackets.set("new Set([...document.querySelectorAll('*')])", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "input": "new Set([...document.querySelectorAll('*')])",
+  "result": {
+    "type": "object",
+    "actor": "server1.conn0.child1/obj55",
+    "class": "Set",
+    "extensible": true,
+    "frozen": false,
+    "sealed": false,
+    "ownPropertyLength": 0,
+    "preview": {
+      "kind": "ArrayLike",
+      "length": 3,
+      "items": [
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj58",
+          "class": "HTMLHtmlElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "html",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj59",
+          "class": "HTMLHeadElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "head",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        },
+        {
+          "type": "object",
+          "actor": "server1.conn0.child1/obj60",
+          "class": "HTMLBodyElement",
+          "extensible": true,
+          "frozen": false,
+          "sealed": false,
+          "ownPropertyLength": 0,
+          "preview": {
+            "kind": "DOMNode",
+            "nodeType": 1,
+            "nodeName": "body",
+            "attributes": {},
+            "attributesLength": 0
+          }
+        }
+      ]
+    }
+  },
+  "timestamp": 1489096918039,
+  "exception": null,
+  "frame": null,
+  "helperResult": null,
+  "notes": null
+});
+
 module.exports = {
   stubPreparedMessages,
   stubPackets,
 };
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/new-console-output/test/utils/messages.test.js
@@ -0,0 +1,104 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+const {
+  getNodeGripsFromMessage,
+} = require("devtools/client/webconsole/new-console-output/utils/messages");
+const {
+  stubPreparedMessages,
+} = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index");
+
+const expect = require("expect");
+
+describe("getNodeGripsFromMessage:", () => {
+  it("returns the expected node grips for a logged nodeList", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("console.log(document.querySelectorAll('*'))"));
+    expect(nodeGrips.length).toEqual(7);
+  });
+
+  it("returns the expected node grips for a logged node", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("console.log(document.querySelector('*'))"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for a logged array of nodes", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("console.log([...document.querySelectorAll('*')])"));
+    expect(nodeGrips.length).toEqual(7);
+  });
+
+  it("returns the expected node grips for a logged object with a node value", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("console.log({node: document.querySelector('*')})"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for a logged Map with a node value", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("console.log(new Map([['node', document.querySelector('*')]]))"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for a logged Map with a node key", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("console.log(new Map([[document.querySelector('*'), 'node']]))"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for a logged Set with nodes", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("console.log(new Set([...document.querySelectorAll('*')]))"));
+    expect(nodeGrips.length).toEqual(7);
+  });
+
+  it("returns the expected node grips for a logged text node", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("console.log(document.querySelector('p').firstChild)"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for an evaluated nodeList", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("document.querySelectorAll('*')"));
+    expect(nodeGrips.length).toEqual(3);
+  });
+
+  it("returns the expected node grips for an evaluated node", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("document.querySelector('*')"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for an evaluated array of nodes", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("[...document.querySelectorAll('*')]"));
+    expect(nodeGrips.length).toEqual(3);
+  });
+
+  it("returns the expected node grips for an evaluated object with a node value", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("x = {node: document.querySelector('*')}"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for an evaluated Map with a node value", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("new Map([['node', document.querySelector('*')]])"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for an evaluated Map with a node key", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("new Map([[document.querySelector('*'), 'node']])"));
+    expect(nodeGrips.length).toEqual(1);
+  });
+
+  it("returns the expected node grips for an evaluated Set with nodes", () => {
+    const nodeGrips = getNodeGripsFromMessage(
+      stubPreparedMessages.get("new Set([...document.querySelectorAll('*')])"));
+    expect(nodeGrips.length).toEqual(3);
+  });
+});