Bug #93270
Updated by Benjamin Franzke about 3 years ago
If BroadcastMessage is recreated using @BroadcastMessage.fromData()@ it does not retain the original object structure. This is because @BroadcastMessage.fromData()@ nests the entrire data (which includes a @payload@ property itself) into another wrapping @payload@ property.
Given following JavaScript code (executable in a Browser console in a window of the TYPO3 Backend):
<pre><code class="javascript">
window.require(['TYPO3/CMS/Backend/BroadcastMessage'], ({BroadcastMessage}) => {
const bm1 = new BroadcastMessage('component', 'eventName', {foo: 'bar'})
// Create bm2 from bm1, as if bm1 has been sent via broadcastchannel
const bm2 = BroadcastMessage.fromData(bm1)
console.log('bm1', bm1.payload)
console.log('bm2', bm2.payload)
})
</code></pre>
The expected result/output is that @payload@ contains the same value for both @BroadcastMessage@ instances:
<pre>
bm1 {foo: "bar"}
bm2 {foo: "bar"}
</pre>
While it actually is:
<pre>
bm1 {foo: "bar"}
bm2 {payload: {payload: {foo: "bar"}}
</pre>
@BroadcastMessage.fromData()@ should be fixed to be idempotent, while keeping backwards compatibility (to existing event-subscribers) by doing the "additional" payload wrapping in @BroadcastMessage.createCustomEvent@. The "good" thing is, that BroadcastMessage isn't used directly by subscribers, it is transformed into a @CustomEvent@, therefore this can be fixed without breaking BC.