From 73bf45e64bc8899a8f53b06e3727ea8733817473 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 16 Feb 2021 14:13:31 +0100 Subject: [PATCH] Support `Map` and `Set`, with `postMessage`, when workers are disabled The `LoopbackPort` currently doesn't support `Map` and `Set`, which it should since the "structured clone algorithm" used in browsers does support both of them; please see https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#supported_types --- src/display/api.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/display/api.js b/src/display/api.js index c8c5c025b..86b564e48 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -1656,8 +1656,24 @@ class LoopbackPort { cloned.set(value, result); return result; } + if (value instanceof Map) { + result = new Map(); + cloned.set(value, result); // Adding to cache now for cyclic references. + for (const [key, val] of value) { + result.set(key, cloneValue(val)); + } + return result; + } + if (value instanceof Set) { + result = new Set(); + cloned.set(value, result); // Adding to cache now for cyclic references. + for (const val of value) { + result.add(cloneValue(val)); + } + return result; + } result = Array.isArray(value) ? [] : {}; - cloned.set(value, result); // adding to cache now for cyclic references + cloned.set(value, result); // Adding to cache now for cyclic references. // Cloning all value and object properties, however ignoring properties // defined via getter. for (const i in value) {