Bug 1287958 - New console frontend: Add keys to messages. r=linclark, r=bgrins draft
authorPeter Elmers <peter.elmers@yahoo.com>
Tue, 19 Jul 2016 15:41:39 -0700
changeset 396434 a243f771a6cf804c51640e4416c2cc594ca1d811
parent 396350 331c4166a3a2df2d3a037107addef5d85cdc31b5
child 396799 a340924ac4b047893abb583c2a7f32515c2debb5
push id25002
push userbmo:lclark@mozilla.com
push dateWed, 03 Aug 2016 21:01:19 +0000
reviewerslinclark, bgrins
bugs1287958
milestone51.0a1
Bug 1287958 - New console frontend: Add keys to messages. r=linclark, r=bgrins
devtools/client/webconsole/new-console-output/components/console-output.js
devtools/client/webconsole/new-console-output/test/actions/test_messages.js
devtools/client/webconsole/new-console-output/test/store/test_messages.js
devtools/client/webconsole/new-console-output/types.js
devtools/client/webconsole/new-console-output/utils/messages.js
--- a/devtools/client/webconsole/new-console-output/components/console-output.js
+++ b/devtools/client/webconsole/new-console-output/components/console-output.js
@@ -38,17 +38,17 @@ const ConsoleOutput = createClass({
       let node = ReactDOM.findDOMNode(this);
       node.scrollTop = node.scrollHeight;
     }
   },
 
   render() {
     let messageNodes = this.props.messages.map(function (message) {
       return (
-        MessageContainer({ message })
+        MessageContainer({ message, key: message.id })
       );
     });
     return (
       dom.div({className: "webconsole-output"}, messageNodes)
     );
   }
 });
 
--- a/devtools/client/webconsole/new-console-output/test/actions/test_messages.js
+++ b/devtools/client/webconsole/new-console-output/test/actions/test_messages.js
@@ -18,16 +18,19 @@ function run_test() {
 add_task(function* () {
   const packet = testPackets.get("console.log");
   const action = messageAdd(packet);
   const expected = {
     type: constants.MESSAGE_ADD,
     // Prepare message is tested independently.
     message: prepareMessage(packet)
   };
+  // Remove ID for deepEqual comparison.
+  action.message = action.message.remove('id');
+  expected.message = expected.message.remove('id');
   deepEqual(action, expected,
     "messageAdd action creator returns expected action object");
 });
 
 add_task(function* () {
   const action = messagesClear();
   const expected = {
     type: constants.MESSAGES_CLEAR,
--- a/devtools/client/webconsole/new-console-output/test/store/test_messages.js
+++ b/devtools/client/webconsole/new-console-output/test/store/test_messages.js
@@ -20,19 +20,24 @@ function run_test() {
  */
 add_task(function* () {
   const { getState, dispatch } = storeFactory();
 
   dispatch(actions.messageAdd(packet));
 
   const expectedMessage = prepareMessage(packet);
 
-  let messages = getAllMessages(getState());
-  deepEqual(messages.toArray(), [expectedMessage],
-    "MESSAGE_ADD action adds a message");
+  const messages = getAllMessages(getState());
+  equal(messages.size, 1, "We added exactly one message.")
+
+  const message = messages.first();
+  notEqual(message.id, expectedMessage.id, "ID should be unique.");
+  // Remove ID for deepEqual comparison.
+  deepEqual(message.remove('id'), expectedMessage.remove('id'),
+      "MESSAGE_ADD action adds a message");
 });
 
 /**
  * Test repeating messages in the store.
  */
 add_task(function* () {
   const { getState, dispatch } = storeFactory();
 
@@ -77,17 +82,17 @@ add_task(function*() {
 
   let messages = getAllMessages(getState());
   equal(messages.size, 1,
     "MESSAGE_ADD action adds a message");
 
   dispatch(actions.messageAdd(clearPacket));
 
   messages = getAllMessages(getState());
-  deepEqual(messages.first(), prepareMessage(clearPacket),
+  deepEqual(messages.first().remove('id'), prepareMessage(clearPacket).remove('id'),
     "console.clear clears existing messages and add a new one");
 });
 
 /**
  * Test message limit on the store.
  */
 add_task(function* () {
   const { getState, dispatch } = storeFactory();
--- a/devtools/client/webconsole/new-console-output/types.js
+++ b/devtools/client/webconsole/new-console-output/types.js
@@ -22,9 +22,10 @@ exports.ConsoleMessage = Immutable.Recor
   type: null,
   level: null,
   messageText: null,
   parameters: null,
   repeat: 1,
   repeatId: null,
   category: "output",
   severity: "log",
+  id: null,
 });
--- a/devtools/client/webconsole/new-console-output/utils/messages.js
+++ b/devtools/client/webconsole/new-console-output/utils/messages.js
@@ -17,16 +17,22 @@ const {
   LEVELS,
   SEVERITY_LOG,
 } = require("../constants");
 const WebConsoleUtils = require("devtools/shared/webconsole/utils").Utils;
 const STRINGS_URI = "chrome://devtools/locale/webconsole.properties";
 const l10n = new WebConsoleUtils.L10n(STRINGS_URI);
 const { ConsoleMessage } = require("../types");
 
+let messageId = 0;
+function getNextMessageId() {
+  // Return the next message id, as a string.
+  return "" + messageId++;
+}
+
 function prepareMessage(packet) {
   // This packet is already in the expected packet structure. Simply return.
   if (packet.source) {
     return packet;
   }
 
   return transformPacket(packet);
 }
@@ -69,16 +75,17 @@ function transformPacket(packet) {
         source: MESSAGE_SOURCE.CONSOLE_API,
         type,
         level,
         parameters,
         messageText,
         repeatId: getRepeatId(message),
         category: CATEGORY_WEBDEV,
         severity: level,
+        id: getNextMessageId(),
       });
     }
 
     case "pageError": {
       let { pageError } = packet;
       let level = MESSAGE_LEVEL.ERROR;
       if (pageError.warning || pageError.strict) {
         level = MESSAGE_LEVEL.WARN;
@@ -88,41 +95,43 @@ function transformPacket(packet) {
 
       return new ConsoleMessage({
         source: MESSAGE_SOURCE.JAVASCRIPT,
         type: MESSAGE_TYPE.LOG,
         messageText: pageError.errorMessage,
         repeatId: getRepeatId(pageError),
         category: CATEGORY_JS,
         severity: level,
+        id: getNextMessageId(),
       });
     }
 
     case "evaluationResult":
     default: {
       let { result } = packet;
 
       return new ConsoleMessage({
         source: MESSAGE_SOURCE.JAVASCRIPT,
         type: MESSAGE_TYPE.RESULT,
         level: MESSAGE_LEVEL.LOG,
         parameters: result,
         repeatId: getRepeatId(result),
         category: CATEGORY_OUTPUT,
         severity: SEVERITY_LOG,
+        id: getNextMessageId(),
       });
     }
   }
 }
 
 // Helpers
 function getRepeatId(message) {
   let clonedMessage = JSON.parse(JSON.stringify(message));
+  delete clonedMessage.id;
   delete clonedMessage.timeStamp;
-  delete clonedMessage.uniqueID;
   return JSON.stringify(clonedMessage);
 }
 
 function convertCachedPacket(packet) {
   // The devtools server provides cached message packets in a different shape
   // from those of consoleApiCalls, so we prepare them for preparation here.
   let convertPacket = {};
   if (packet._type === "ConsoleAPI") {