diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js b/devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js index 4e4a8b0e7f6c..19aa422700c3 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js @@ -40,9 +40,10 @@ add_task(async function() { let failed = false; for (const [key, packet] of generatedStubs) { - const packetStr = getSerializedPacket(packet); + const packetStr = getSerializedPacket(packet, { sortKeys: true }); const existingPacketStr = getSerializedPacket( - existingStubs.rawPackets.get(key) + existingStubs.rawPackets.get(key), + { sortKeys: true } ); is(packetStr, existingPacketStr, `"${key}" packet has expected value`); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_stubs_evaluation_result.js b/devtools/client/webconsole/test/browser/browser_webconsole_stubs_evaluation_result.js index 1186296cd0fd..58b4e3aaf380 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_stubs_evaluation_result.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_stubs_evaluation_result.js @@ -39,9 +39,10 @@ add_task(async function() { let failed = false; for (const [key, packet] of generatedStubs) { - const packetStr = getSerializedPacket(packet); + const packetStr = getSerializedPacket(packet, { sortKeys: true }); const existingPacketStr = getSerializedPacket( - existingStubs.rawPackets.get(key) + existingStubs.rawPackets.get(key), + { sortKeys: true } ); is(packetStr, existingPacketStr, `"${key}" packet has expected value`); failed = failed || packetStr !== existingPacketStr; diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_stubs_page_error.js b/devtools/client/webconsole/test/browser/browser_webconsole_stubs_page_error.js index 39255a32c269..287f7f45b28d 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_stubs_page_error.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_stubs_page_error.js @@ -43,9 +43,10 @@ add_task(async function() { let failed = false; for (const [key, packet] of generatedStubs) { - const packetStr = getSerializedPacket(packet); + const packetStr = getSerializedPacket(packet, { sortKeys: true }); const existingPacketStr = getSerializedPacket( - existingStubs.rawPackets.get(key) + existingStubs.rawPackets.get(key), + { sortKeys: true } ); is(packetStr, existingPacketStr, `"${key}" packet has expected value`); failed = failed || packetStr !== existingPacketStr; diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_stubs_platform_messages.js b/devtools/client/webconsole/test/browser/browser_webconsole_stubs_platform_messages.js index a3e135028a45..36ea9c383e13 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_stubs_platform_messages.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_stubs_platform_messages.js @@ -40,9 +40,10 @@ add_task(async function() { let failed = false; for (const [key, packet] of generatedStubs) { - const packetStr = getSerializedPacket(packet); + const packetStr = getSerializedPacket(packet, { sortKeys: true }); const existingPacketStr = getSerializedPacket( - existingStubs.rawPackets.get(key) + existingStubs.rawPackets.get(key), + { sortKeys: true } ); is(packetStr, existingPacketStr, `"${key}" packet has expected value`); failed = failed || packetStr !== existingPacketStr; diff --git a/devtools/client/webconsole/test/browser/stub-generator-helpers.js b/devtools/client/webconsole/test/browser/stub-generator-helpers.js index 69b29dcdbd1c..7951841b816d 100644 --- a/devtools/client/webconsole/test/browser/stub-generator-helpers.js +++ b/devtools/client/webconsole/test/browser/stub-generator-helpers.js @@ -466,7 +466,38 @@ function getStubFile(fileName) { return require(CHROME_PREFIX + STUBS_FOLDER + fileName); } -function getSerializedPacket(packet) { +function sortObjectKeys(obj) { + const isArray = Array.isArray(obj); + const isObject = Object.prototype.toString.call(obj) === "[object Object]"; + const isFront = obj?._grip; + + if (isObject && !isFront) { + // Reorder keys for objects, but skip fronts to avoid infinite recursion. + const sortedKeys = Object.keys(obj).sort((k1, k2) => k1.localeCompare(k2)); + const withSortedKeys = {}; + sortedKeys.forEach(k => { + withSortedKeys[k] = k !== "stacktrace" ? sortObjectKeys(obj[k]) : obj[k]; + }); + return withSortedKeys; + } else if (isArray) { + return obj.map(item => sortObjectKeys(item)); + } + return obj; +} + +/** + * @param {Object} packet + * The packet to serialize. + * @param {Object} + * - {Boolean} sortKeys: pass true to sort all keys alphabetically in the + * packet before serialization. For instance stub comparison should not + * fail if the order of properties changed. + */ +function getSerializedPacket(packet, { sortKeys = false } = {}) { + if (sortKeys) { + packet = sortObjectKeys(packet); + } + return JSON.stringify( packet, function(_, value) {