Bug 1432232 - Implement prefix support in new console frontend; r=bgrins. draft
authorNicolas Chevobbe <nchevobbe@mozilla.com>
Thu, 22 Feb 2018 16:30:16 +0100
changeset 758939 d73e96545400d5bb83c51953d1b75ac8e03ca959
parent 758927 6661c077325c35af028f1cdaa660f673cbea39be
push id100231
push userbmo:nchevobbe@mozilla.com
push dateFri, 23 Feb 2018 13:04:27 +0000
reviewersbgrins
bugs1432232
milestone60.0a1
Bug 1432232 - Implement prefix support in new console frontend; r=bgrins. The prefix property was already on the packet, so all we had to do was to support it. Which means: - retrieve the property in the packet and pass it to the message - when prefix exists, add a dom element with a custom style - search in prefix when filtering. We add a couple of mocha tests with a stub packet to make sure we handle those cases like we should. MozReview-Commit-ID: KFkt685AdfE
devtools/client/themes/webconsole.css
devtools/client/webconsole/new-console-output/components/message-types/ConsoleApiCall.js
devtools/client/webconsole/new-console-output/reducers/messages.js
devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js
devtools/client/webconsole/new-console-output/test/components/message-location.test.js
devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
devtools/client/webconsole/new-console-output/test/fixtures/stubs/cssMessage.js
devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
devtools/client/webconsole/new-console-output/test/fixtures/stubs/pageError.js
devtools/client/webconsole/new-console-output/test/store/filters.test.js
devtools/client/webconsole/new-console-output/types.js
devtools/client/webconsole/new-console-output/utils/messages.js
--- a/devtools/client/themes/webconsole.css
+++ b/devtools/client/themes/webconsole.css
@@ -989,16 +989,21 @@ a.learn-more-link.webconsole-learn-more-
 
 /* The bubble that shows the number of times a message is repeated */
 .webconsole-output-wrapper .message-repeats {
   background-color: var(--repeat-bubble-background-color);
   font-weight: normal;
   font-size: 0.8em;
 }
 
+/* Prefix text that can be set by ConsoleAPI option */
+.webconsole-output-wrapper .console-message-prefix {
+  color: var(--theme-comment);
+}
+
 /* Network Messages */
 
 .webconsole-output-wrapper .message.network .method {
   margin-inline-end: 5px;
 }
 
 .webconsole-output-wrapper .message.network .xhr {
   background-color: var(--theme-comment);
--- a/devtools/client/webconsole/new-console-output/components/message-types/ConsoleApiCall.js
+++ b/devtools/client/webconsole/new-console-output/components/message-types/ConsoleApiCall.js
@@ -46,16 +46,17 @@ function ConsoleApiCall(props) {
     source,
     type,
     level,
     stacktrace,
     frame,
     timeStamp,
     parameters,
     messageText,
+    prefix,
     userProvidedStyles,
   } = message;
 
   let messageBody;
   const messageBodyConfig = {
     dispatch,
     messageId,
     parameters,
@@ -69,16 +70,21 @@ function ConsoleApiCall(props) {
   } else if (type === "assert") {
     let reps = formatReps(messageBodyConfig);
     messageBody = dom.span({ className: "cm-variable" }, "Assertion failed: ", reps);
   } else if (type === "table") {
     // TODO: Chrome does not output anything, see if we want to keep this
     messageBody = dom.span({className: "cm-variable"}, "console.table()");
   } else if (parameters) {
     messageBody = formatReps(messageBodyConfig);
+    if (prefix) {
+      messageBody.unshift(dom.span({
+        className: "console-message-prefix"
+      }, `${prefix}: `));
+    }
   } else {
     messageBody = messageText;
   }
 
   let attachment = null;
   if (type === "table") {
     attachment = ConsoleTable({
       dispatch,
--- a/devtools/client/webconsole/new-console-output/reducers/messages.js
+++ b/devtools/client/webconsole/new-console-output/reducers/messages.js
@@ -698,16 +698,18 @@ function passSearchFilters(message, filt
     // Look for a match in net events.
     || isTextInNetEvent(text, message.request)
     // Look for a match in stack-trace.
     || isTextInStackTrace(text, message.stacktrace)
     // Look for a match in messageText.
     || isTextInMessageText(text, message.messageText)
     // Look for a match in notes.
     || isTextInNotes(text, message.notes)
+    // Look for a match in prefix.
+    || isTextInPrefix(text, message.prefix)
   );
 }
 
 /**
 * Returns true if given text is included in provided stack frame.
 */
 function isTextInFrame(text, frame) {
   if (!frame) {
@@ -800,16 +802,27 @@ function isTextInNotes(text, notes) {
     (
       note.messageBody &&
       note.messageBody.toLocaleLowerCase().includes(text.toLocaleLowerCase())
     )
   );
 }
 
 /**
+* Returns true if given text is included in prefix.
+*/
+function isTextInPrefix(text, prefix) {
+  if (!prefix) {
+    return false;
+  }
+
+  return `${prefix}: `.toLocaleLowerCase().includes(text.toLocaleLowerCase());
+}
+
+/**
  * Get a flat array of all the grips and their properties.
  *
  * @param {Array} Grips
  * @return {Array} Flat array of the grips and their properties.
  */
 function getAllProps(grips) {
   let result = grips.reduce((res, grip) => {
     let previewItems = getGripPreviewItems(grip);
--- 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
@@ -14,16 +14,17 @@ const { setupStore } = require("devtools
 
 // Components under test.
 const ConsoleApiCall = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/ConsoleApiCall"));
 const {
   MESSAGE_OPEN,
   MESSAGE_CLOSE,
 } = require("devtools/client/webconsole/new-console-output/constants");
 const { INDENT_WIDTH } = require("devtools/client/webconsole/new-console-output/components/MessageIndent");
+const {prepareMessage} = require("devtools/client/webconsole/new-console-output/utils/messages");
 
 // Test fakes.
 const { stubPreparedMessages } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index");
 const serviceContainer = require("devtools/client/webconsole/new-console-output/test/fixtures/serviceContainer");
 
 describe("ConsoleAPICall component:", () => {
   describe("console.log", () => {
     it("renders string grips", () => {
@@ -82,16 +83,47 @@ describe("ConsoleAPICall component:", ()
       const secondElementStyle = elements.eq(1).prop("style");
       expect(secondElementStyle.color).toBe(undefined);
 
       const thirdElementStyle = elements.eq(2).prop("style");
       // Allowed styles are applied accordingly on the third element.
       expect(thirdElementStyle.color).toBe("blue");
     });
 
+    it("renders prefixed messages", () => {
+      const stub = {
+        "level": "debug",
+        "filename": "resource:///modules/CustomizableUI.jsm",
+        "lineNumber": 181,
+        "functionName": "initialize",
+        "timeStamp": 1519311532912,
+        "arguments": [
+          "Initializing"
+        ],
+        "prefix": "MyNicePrefix",
+        "workerType": "none",
+        "styles": [],
+        "category": "webdev",
+        "_type": "ConsoleAPI"
+      };
+      const wrapper = render(ConsoleApiCall({
+        message: prepareMessage(stub, {getNextId: () => "p"}),
+        serviceContainer
+      }));
+      const prefix = wrapper.find(".console-message-prefix");
+      expect(prefix.text()).toBe("MyNicePrefix: ");
+
+      expect(wrapper.find(".message-body").text()).toBe("MyNicePrefix: Initializing");
+
+      // There should be the location
+      const locationLink = wrapper.find(`.message-location`);
+      expect(locationLink.length).toBe(1);
+      expect(locationLink.text()).toBe("CustomizableUI.jsm:181");
+    });
+
     it("renders repeat node", () => {
       const message = stubPreparedMessages.get("console.log('foobar', 'test')");
       const wrapper = render(ConsoleApiCall({
         message,
         serviceContainer,
         repeat: 107
       }));
 
--- a/devtools/client/webconsole/new-console-output/test/components/message-location.test.js
+++ b/devtools/client/webconsole/new-console-output/test/components/message-location.test.js
@@ -35,17 +35,17 @@ describe("Message - location element", (
     expect(locationLink.text()).toBe("test-console-api.html:1:27");
 
     locationLink.simulate("click");
 
     expect(onViewSourceInDebugger.calledOnce).toBe(true);
     expect(onViewSource.notCalled).toBe(true);
   });
 
-  it.only("Calls onViewSource when clicked and onViewSourceInDebugger undefined", () => {
+  it("Calls onViewSource when clicked and onViewSourceInDebugger undefined", () => {
     const onViewSource = sinon.spy();
 
     const message = stubPreparedMessages.get("console.log('foobar', 'test')");
 
     const wrapper = mount(MessageContainer({
       getMessage: () => message,
       serviceContainer: Object.assign({}, serviceContainer, {
         onViewSource,
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
@@ -32,17 +32,18 @@ stubPreparedMessages.set(`console.log('f
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log(undefined)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924479,
   "type": "log",
@@ -60,17 +61,18 @@ stubPreparedMessages.set(`console.log(un
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.warn('danger, will robinson!')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924487,
   "type": "warn",
@@ -86,17 +88,18 @@ stubPreparedMessages.set(`console.warn('
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log(NaN)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924495,
   "type": "log",
@@ -114,17 +117,18 @@ stubPreparedMessages.set(`console.log(Na
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log(null)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924501,
   "type": "log",
@@ -142,17 +146,18 @@ stubPreparedMessages.set(`console.log(nu
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log('鼬')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924506,
   "type": "log",
@@ -168,17 +173,18 @@ stubPreparedMessages.set(`console.log('鼬')`, new ConsoleMessage({
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.clear()`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924512,
   "type": "clear",
@@ -194,17 +200,18 @@ stubPreparedMessages.set(`console.clear(
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count('bar')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924515,
   "type": "log",
@@ -218,17 +225,18 @@ stubPreparedMessages.set(`console.count(
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.assert(false, {message: 'foobar'})`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924521,
   "type": "assert",
@@ -274,17 +282,18 @@ stubPreparedMessages.set(`console.assert
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log('hello \nfrom \rthe \"string world!')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924528,
   "type": "log",
@@ -300,17 +309,18 @@ stubPreparedMessages.set(`console.log('h
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log('úṇĩçödê țĕșť')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924586,
   "type": "log",
@@ -326,17 +336,18 @@ stubPreparedMessages.set(`console.log('úṇĩçödê țĕșť')`, new ConsoleMessage({
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.dirxml(window)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924596,
   "type": "log",
@@ -364,17 +375,18 @@ stubPreparedMessages.set(`console.dirxml
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log('myarray', ['red', 'green', 'blue'])`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924604,
   "type": "log",
@@ -408,17 +420,18 @@ stubPreparedMessages.set(`console.log('m
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log('myregex', /a.b.c/)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924610,
   "type": "log",
@@ -444,17 +457,18 @@ stubPreparedMessages.set(`console.log('m
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.table(['red', 'green', 'blue']);`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924612,
   "type": "table",
@@ -487,17 +501,18 @@ stubPreparedMessages.set(`console.table(
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log('myobject', {red: 'redValue', green: 'greenValue', blue: 'blueValue'});`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924614,
   "type": "log",
@@ -549,17 +564,18 @@ stubPreparedMessages.set(`console.log('m
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.debug('debug message');`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924621,
   "type": "debug",
@@ -575,17 +591,18 @@ stubPreparedMessages.set(`console.debug(
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.info('info message');`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924625,
   "type": "info",
@@ -601,17 +618,18 @@ stubPreparedMessages.set(`console.info('
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.error('error message');`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924628,
   "type": "error",
@@ -634,17 +652,18 @@ stubPreparedMessages.set(`console.error(
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log('mymap')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924631,
   "type": "log",
@@ -683,17 +702,18 @@ stubPreparedMessages.set(`console.log('m
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 5,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log('myset')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924746,
   "type": "log",
@@ -726,17 +746,18 @@ stubPreparedMessages.set(`console.log('m
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.trace()`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924752,
   "type": "trace",
@@ -769,17 +790,18 @@ stubPreparedMessages.set(`console.trace(
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 3,
     "column": 3
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.time('bar')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924757,
   "type": "nullMessage",
@@ -793,17 +815,18 @@ stubPreparedMessages.set(`console.time('
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`timerAlreadyExists`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924758,
   "type": "time",
@@ -817,17 +840,18 @@ stubPreparedMessages.set(`timerAlreadyEx
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 3,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.timeEnd('bar')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924759,
   "type": "timeEnd",
@@ -841,17 +865,18 @@ stubPreparedMessages.set(`console.timeEn
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 4,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`timerDoesntExist`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924759,
   "type": "timeEnd",
@@ -865,17 +890,18 @@ stubPreparedMessages.set(`timerDoesntExi
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 5,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.table('bar')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924801,
   "type": "log",
@@ -891,17 +917,18 @@ stubPreparedMessages.set(`console.table(
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.table(['a', 'b', 'c'])`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924859,
   "type": "table",
@@ -934,17 +961,18 @@ stubPreparedMessages.set(`console.table(
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.group('bar')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924863,
   "type": "startGroup",
@@ -960,17 +988,18 @@ stubPreparedMessages.set(`console.group(
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.groupEnd('bar')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924864,
   "type": "endGroup",
@@ -984,17 +1013,18 @@ stubPreparedMessages.set(`console.groupE
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 3,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.groupCollapsed('foo')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924870,
   "type": "startGroupCollapsed",
@@ -1010,17 +1040,18 @@ stubPreparedMessages.set(`console.groupC
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.groupEnd('foo')`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924871,
   "type": "endGroup",
@@ -1034,17 +1065,18 @@ stubPreparedMessages.set(`console.groupE
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 3,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.group()`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924878,
   "type": "startGroup",
@@ -1060,17 +1092,18 @@ stubPreparedMessages.set(`console.group(
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.groupEnd()`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924879,
   "type": "endGroup",
@@ -1084,17 +1117,18 @@ stubPreparedMessages.set(`console.groupE
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 3,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log(%cfoobar)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924883,
   "type": "log",
@@ -1114,17 +1148,18 @@ stubPreparedMessages.set(`console.log(%c
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [
     "color:blue; font-size:1.3em; background:url('http://example.com/test'); position:absolute; top:10px; ",
     "color:red; line-height: 1.5; background:url('http://example.com/test')"
   ],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.log("%cHello%c|%cWorld")`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1518681614352,
   "type": "log",
@@ -1146,17 +1181,18 @@ stubPreparedMessages.set(`console.log("%
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [
     "color:red",
     "",
     "color: blue"
   ],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.group(%cfoo%cbar)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924887,
   "type": "startGroup",
@@ -1176,17 +1212,18 @@ stubPreparedMessages.set(`console.group(
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [
     "color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px",
     "color:red;background:url('http://example.com/test')"
   ],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.groupEnd(%cfoo%cbar)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924887,
   "type": "endGroup",
@@ -1200,17 +1237,18 @@ stubPreparedMessages.set(`console.groupE
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 6,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.groupCollapsed(%cfoo%cbaz)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924892,
   "type": "startGroupCollapsed",
@@ -1230,17 +1268,18 @@ stubPreparedMessages.set(`console.groupC
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [
     "color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px",
     "color:red;background:url('http://example.com/test')"
   ],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.groupEnd(%cfoo%cbaz)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924893,
   "type": "endGroup",
@@ -1254,17 +1293,18 @@ stubPreparedMessages.set(`console.groupE
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 6,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.dir({C, M, Y, K})`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1502884924899,
   "type": "dir",
@@ -1321,17 +1361,18 @@ stubPreparedMessages.set(`console.dir({C
     "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,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count | default: 1`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1511365913333,
   "type": "log",
@@ -1345,17 +1386,18 @@ stubPreparedMessages.set(`console.count 
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count | default: 2`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1511365913334,
   "type": "log",
@@ -1369,17 +1411,18 @@ stubPreparedMessages.set(`console.count 
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 3,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count | test counter: 1`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1511365913334,
   "type": "log",
@@ -1393,17 +1436,18 @@ stubPreparedMessages.set(`console.count 
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 4,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count | test counter: 2`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1511365913334,
   "type": "log",
@@ -1417,17 +1461,18 @@ stubPreparedMessages.set(`console.count 
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 5,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count | default: 3`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1511365913334,
   "type": "log",
@@ -1441,17 +1486,18 @@ stubPreparedMessages.set(`console.count 
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 6,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count | clear`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1511365913334,
   "type": "clear",
@@ -1467,17 +1513,18 @@ stubPreparedMessages.set(`console.count 
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 7,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count | default: 4`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1511365913335,
   "type": "log",
@@ -1491,17 +1538,18 @@ stubPreparedMessages.set(`console.count 
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 8,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`console.count | test counter: 3`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1511365913335,
   "type": "log",
@@ -1515,17 +1563,18 @@ stubPreparedMessages.set(`console.count 
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 9,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPackets.set(`console.log('foobar', 'test')`, {
   "from": "server1.conn0.child1/consoleActor2",
   "type": "consoleAPICall",
   "message": {
     "addonId": "",
     "arguments": [
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/cssMessage.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/cssMessage.js
@@ -28,17 +28,18 @@ stubPreparedMessages.set(`Unknown property ‘such-unknown-property’.  Declaration dropped.`, new ConsoleMessage({
   "frame": {
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-css-message.html",
     "line": 3,
     "column": 25
   },
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`Error in parsing value for ‘padding-top’.  Declaration dropped.`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "css",
   "timeStamp": 1479159920465,
   "type": "log",
@@ -51,17 +52,18 @@ stubPreparedMessages.set(`Error in parsing value for ‘padding-top’.  Declaration dropped.`, new ConsoleMessage({
   "frame": {
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-css-message.html",
     "line": 3,
     "column": 16
   },
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPackets.set(`Unknown property ‘such-unknown-property’.  Declaration dropped.`, {
   "from": "server1.conn0.child1/consoleActor2",
   "type": "pageError",
   "pageError": {
     "errorMessage": "Unknown property ‘such-unknown-property’.  Declaration dropped.",
     "errorMessageName": "",
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
@@ -36,17 +36,18 @@ stubPreparedMessages.set(`new Date(0)`, 
     }
   ],
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"log\",\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj30\",\"class\":\"Date\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"timestamp\":0}}],\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`asdf()`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1479159921377,
   "type": "result",
@@ -64,17 +65,18 @@ stubPreparedMessages.set(`asdf()`, new C
     "source": "debugger eval code",
     "line": 1,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": "https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Not_defined?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default",
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`1 + @`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1479159921399,
   "type": "result",
@@ -92,17 +94,18 @@ stubPreparedMessages.set(`1 + @`, new Co
     "source": "debugger eval code",
     "line": 1,
     "column": 4
   },
   "groupId": null,
   "exceptionDocURL": "https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Illegal_character?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default",
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`inspect({a: 1})`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1499776070751,
   "type": "result",
@@ -135,17 +138,18 @@ stubPreparedMessages.set(`inspect({a: 1}
     }
   ],
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"log\",\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj35\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"a\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":1}},\"ownSymbols\":[],\"ownPropertiesLength\":1,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`cd(document)`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1510650094657,
   "type": "result",
@@ -158,17 +162,18 @@ stubPreparedMessages.set(`cd(document)`,
     }
   ],
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"Cannot cd() to the given window. Invalid argument.\",\"parameters\":[{\"type\":\"undefined\"}],\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`undefined`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1518606917356,
   "type": "result",
@@ -180,17 +185,18 @@ stubPreparedMessages.set(`undefined`, ne
     }
   ],
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"log\",\"parameters\":[{\"type\":\"undefined\"}],\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`longString message Error`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1493108241073,
   "type": "result",
@@ -208,17 +214,18 @@ stubPreparedMessages.set(`longString mes
     }
   ],
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":{\"type\":\"longString\",\"initial\":\"Error: Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Lon\",\"length\":110007,\"actor\":\"server1.conn0.child1/longString37\"},\"parameters\":[{\"type\":\"undefined\"}],\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`eval throw ""`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1517990289517,
   "type": "result",
@@ -231,17 +238,18 @@ stubPreparedMessages.set(`eval throw ""`
     }
   ],
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"Error\",\"parameters\":[{\"type\":\"undefined\"}],\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`eval throw "tomato"`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1517990289520,
   "type": "result",
@@ -254,17 +262,18 @@ stubPreparedMessages.set(`eval throw "to
     }
   ],
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"Error: tomato\",\"parameters\":[{\"type\":\"undefined\"}],\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPackets.set(`new Date(0)`, {
   "from": "server1.conn0.child1/consoleActor2",
   "input": "new Date(0)",
   "result": {
     "type": "object",
     "actor": "server1.conn0.child1/obj30",
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/pageError.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/pageError.js
@@ -60,17 +60,18 @@ stubPreparedMessages.set(`ReferenceError
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 3,
     "column": 5
   },
   "groupId": null,
   "exceptionDocURL": "https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Not_defined?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default",
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`SyntaxError: redeclaration of let a`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1487992945524,
   "type": "log",
@@ -105,17 +106,18 @@ stubPreparedMessages.set(`SyntaxError: r
       "messageBody": "Previously declared at line 2, column 6",
       "frame": {
         "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
         "line": 2,
         "column": 6
       }
     }
   ],
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`TypeError longString message`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1493109507061,
   "type": "log",
@@ -152,17 +154,18 @@ stubPreparedMessages.set(`TypeError long
   "frame": {
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 1,
     "column": 7
   },
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`throw ""`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1517942398629,
   "type": "log",
@@ -171,17 +174,18 @@ stubPreparedMessages.set(`throw ""`, new
   "messageText": "uncaught exception: ",
   "parameters": null,
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"uncaught exception: \",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPreparedMessages.set(`throw "tomato"`, new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "javascript",
   "timeStamp": 1517942398637,
   "type": "log",
@@ -190,17 +194,18 @@ stubPreparedMessages.set(`throw "tomato"
   "messageText": "uncaught exception: tomato",
   "parameters": null,
   "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"uncaught exception: tomato\",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
-  "indent": 0
+  "indent": 0,
+  "prefix": ""
 }));
 
 stubPackets.set(`ReferenceError: asdf is not defined`, {
   "from": "server1.conn0.child1/consoleActor2",
   "type": "pageError",
   "pageError": {
     "errorMessage": "ReferenceError: asdf is not defined",
     "errorMessageName": "JSMSG_NOT_DEFINED",
--- a/devtools/client/webconsole/new-console-output/test/store/filters.test.js
+++ b/devtools/client/webconsole/new-console-output/test/store/filters.test.js
@@ -181,16 +181,47 @@ describe("Filtering", () => {
       store.dispatch(messagesAdd([traceMessage]));
 
       store.dispatch(actions.filterTextSet("search-location-test.js:85:13"));
 
       let messages = getVisibleMessages(store.getState());
       expect(messages.length - numUnfilterableMessages).toEqual(1);
     });
 
+    it("matches prefixed log message", () => {
+      const stub = {
+        "level": "debug",
+        "filename": "resource:///modules/CustomizableUI.jsm",
+        "lineNumber": 181,
+        "functionName": "initialize",
+        "timeStamp": 1519311532912,
+        "arguments": [
+          "Initializing"
+        ],
+        "prefix": "MyNicePrefix",
+        "workerType": "none",
+        "styles": [],
+        "category": "webdev",
+        "_type": "ConsoleAPI"
+      };
+      store.dispatch(messagesAdd([stub]));
+
+      store.dispatch(actions.filterTextSet("MyNice"));
+      let messages = getVisibleMessages(store.getState());
+      expect(messages.length - numUnfilterableMessages).toEqual(1);
+
+      store.dispatch(actions.filterTextSet("MyNicePrefix"));
+      messages = getVisibleMessages(store.getState());
+      expect(messages.length - numUnfilterableMessages).toEqual(1);
+
+      store.dispatch(actions.filterTextSet("MyNicePrefix:"));
+      messages = getVisibleMessages(store.getState());
+      expect(messages.length - numUnfilterableMessages).toEqual(1);
+    });
+
     it("restores all messages once text is cleared", () => {
       store.dispatch(actions.filterTextSet("danger"));
       store.dispatch(actions.filterTextSet(""));
 
       let messages = getVisibleMessages(store.getState());
       expect(messages.length).toEqual(numMessages);
     });
   });
--- a/devtools/client/webconsole/new-console-output/types.js
+++ b/devtools/client/webconsole/new-console-output/types.js
@@ -38,16 +38,17 @@ exports.ConsoleMessage = function (props
     repeatId: null,
     stacktrace: null,
     frame: null,
     groupId: null,
     exceptionDocURL: null,
     userProvidedStyles: null,
     notes: null,
     indent: 0,
+    prefix: "",
   }, props);
 };
 
 exports.NetworkEventMessage = function (props) {
   return Object.assign({
     id: null,
     actor: null,
     level: MESSAGE_LEVEL.LOG,
--- a/devtools/client/webconsole/new-console-output/utils/messages.js
+++ b/devtools/client/webconsole/new-console-output/utils/messages.js
@@ -15,17 +15,16 @@ const {
   MESSAGE_LEVEL,
 } = require("../constants");
 const {
   ConsoleMessage,
   NetworkEventMessage,
 } = require("../types");
 
 function prepareMessage(packet, idGenerator) {
-  // This packet is already in the expected packet structure. Simply return.
   if (!packet.source) {
     packet = transformPacket(packet);
   }
 
   if (packet.allowRepeating) {
     packet.repeatId = getRepeatId(packet);
   }
   packet.id = idGenerator.getNextId(packet);
@@ -162,16 +161,17 @@ function transformConsoleAPICallPacket(p
     type,
     level,
     parameters,
     messageText,
     stacktrace: message.stacktrace ? message.stacktrace : null,
     frame,
     timeStamp: message.timeStamp,
     userProvidedStyles: message.styles,
+    prefix: message.prefix,
   });
 }
 
 function transformNavigationMessagePacket(packet) {
   let { message } = packet;
   return new ConsoleMessage({
     source: MESSAGE_SOURCE.CONSOLE_API,
     type: MESSAGE_TYPE.LOG,