Project

General

Profile

Actions

Bug #93270

open

BroadcastMessage.fromData() is not idempotent

Added by Benjamin Franzke about 3 years ago. Updated over 2 years ago.

Status:
Under Review
Priority:
Should have
Assignee:
-
Category:
Backend JavaScript
Start date:
2021-01-12
Due date:
% Done:

0%

Estimated time:
TYPO3 Version:
11
PHP Version:
Tags:
Complexity:
Is Regression:
Sprint Focus:

Description

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):

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)
})

The expected result/output is that payload contains the same value for both BroadcastMessage instances:

bm1 {foo: "bar"}
bm2 {foo: "bar"}

While it actually is:

bm1 {foo: "bar"}
bm2 {payload: {foo: "bar"}}

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.

Actions

Also available in: Atom PDF