Bug 1766469 - Handle empty data fields when creating MIDIMessageEvent objects r=padenot

This change matches Chrome's behavior of not throwing in cases when the
data field is null. However contrary to Chrome we populate the object
with an empty array instead of a null reference.

Differential Revision: https://phabricator.services.mozilla.com/D146672
This commit is contained in:
Gabriele Svelto 2022-05-20 05:58:03 +00:00
Родитель 1e61e4307b
Коммит 6ef19ca2a9
3 изменённых файлов: 55 добавлений и 6 удалений

Просмотреть файл

@ -72,12 +72,15 @@ already_AddRefed<MIDIMessageEvent> MIDIMessageEvent::Constructor(
e->InitEvent(aType, aEventInitDict.mBubbles, aEventInitDict.mCancelable);
// Set data for event. Timestamp will always be set to Now() (default for
// event) using this constructor.
const auto& a = aEventInitDict.mData.Value();
a.ComputeState();
e->mData = Uint8Array::Create(aGlobal.Context(), owner, a.Length(), a.Data());
if (NS_WARN_IF(!e->mData)) {
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return nullptr;
if (aEventInitDict.mData.WasPassed()) {
const auto& a = aEventInitDict.mData.Value();
a.ComputeState();
e->mData =
Uint8Array::Create(aGlobal.Context(), owner, a.Length(), a.Data());
if (NS_WARN_IF(!e->mData)) {
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return nullptr;
}
}
e->SetTrusted(trusted);

Просмотреть файл

@ -21,3 +21,4 @@ disabled = Bug 1437204
[test_midi_device_pending.html]
disabled = Bug 1437204
[test_midi_send_messages.html]
[test_midi_message_event.html]

Просмотреть файл

@ -0,0 +1,45 @@
<html>
<head>
<title>WebMIDI MIDIMessageEvent Test</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
<script type="application/javascript" src="MIDITestUtils.js"></script>
</head>
<body>
<script class="testbody" type="application/javascript">
add_task(async () => {
await MIDITestUtils.permissionSetup(true);
is(new MIDIMessageEvent('eventType').bubbles, false, "bubbles field is false by default");
is(new MIDIMessageEvent('eventType').cancelable, false, "cancelable field is false by default");
isDeeply(new MIDIMessageEvent('eventType').data, [], "The default message is empty");
is(new MIDIMessageEvent('eventType', { bubbles: false }).bubbles, false, "bubbles is passed");
is(new MIDIMessageEvent('eventType', { bubbles: true }).bubbles, true, "bubbles is passed");
is(new MIDIMessageEvent('eventType', { cancelable: false }).cancelable, false, "cancelable is passed");
is(new MIDIMessageEvent('eventType', { cancelable: true }).cancelable, true, "cancelable is passed");
var data = new Uint8Array(16);
isDeeply(new MIDIMessageEvent('eventType', { data }).data, data, "data is passed");
// All initializers are passed.
data = new Uint8Array(3);
is(new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data }).bubbles, true, "all initializers are passed");
is(new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data }).cancelable, true, "all initializers are passed");
isDeeply(new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data }).data, data, "all initializers are passed");
if (window.SharedArrayBuffer) {
data = new Uint8Array(new SharedArrayBuffer(3));
doesThrow(() => { new MIDIMessageEvent('eventType', { data }); }, "shared array buffers are rejected");
} else {
todo(false, 'SharedArrayBuffer is unavailable.');
}
});
</script>
</body>
</html>