From 46300eb42bea84017b51006f2a65f8c0336d9244 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Tue, 12 Sep 2017 11:57:26 +0200 Subject: [PATCH] Bug 1359017 - onmessageerror for MessagePort in case StructuredClone algorithm fails when deserializing, r=masayuki, r=smaug --- dom/base/nsGkAtomList.h | 1 + dom/messagechannel/MessagePort.cpp | 19 +++++++++++++++++-- dom/messagechannel/MessagePort.h | 4 ++++ dom/webidl/MessagePort.webidl | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dom/base/nsGkAtomList.h b/dom/base/nsGkAtomList.h index 71e816617056..a03d99c038fe 100644 --- a/dom/base/nsGkAtomList.h +++ b/dom/base/nsGkAtomList.h @@ -920,6 +920,7 @@ GK_ATOM(onloadingerror, "onloadingerror") GK_ATOM(onpopstate, "onpopstate") GK_ATOM(only, "only") // this one is not an event GK_ATOM(onmessage, "onmessage") +GK_ATOM(onmessageerror, "onmessageerror") GK_ATOM(onmousedown, "onmousedown") GK_ATOM(onmouseenter, "onmouseenter") GK_ATOM(onmouseleave, "onmouseleave") diff --git a/dom/messagechannel/MessagePort.cpp b/dom/messagechannel/MessagePort.cpp index aaf3ef0ef373..fb249a3696ed 100644 --- a/dom/messagechannel/MessagePort.cpp +++ b/dom/messagechannel/MessagePort.cpp @@ -694,7 +694,7 @@ MessagePort::Entangled(nsTArray& aMessages) FallibleTArray> data; if (NS_WARN_IF(!SharedMessagePortMessage::FromMessagesToSharedChild(aMessages, data))) { - // OOM, we cannot continue. + DispatchError(); return; } @@ -748,7 +748,7 @@ MessagePort::MessagesReceived(nsTArray& aMessages) FallibleTArray> data; if (NS_WARN_IF(!SharedMessagePortMessage::FromMessagesToSharedChild(aMessages, data))) { - // OOM, We cannot continue. + DispatchError(); return; } @@ -1004,5 +1004,20 @@ MessagePort::ForceClose(const MessagePortIdentifier& aIdentifier) ForceCloseHelper::ForceClose(aIdentifier); } +void +MessagePort::DispatchError() +{ + MessageEventInit init; + init.mBubbles = false; + init.mCancelable = false; + + RefPtr event = + MessageEvent::Constructor(this, NS_LITERAL_STRING("messageerror"), init); + event->SetTrusted(true); + + bool dummy; + DispatchEvent(event, &dummy); +} + } // namespace dom } // namespace mozilla diff --git a/dom/messagechannel/MessagePort.h b/dom/messagechannel/MessagePort.h index 4ca51353dee8..00ad02a79004 100644 --- a/dom/messagechannel/MessagePort.h +++ b/dom/messagechannel/MessagePort.h @@ -74,6 +74,8 @@ class MessagePort final : public DOMEventTargetHelper void SetOnmessage(EventHandlerNonNull* aCallback); + IMPL_EVENT_HANDLER(messageerror) + // Non WebIDL methods void UnshippedEntangle(MessagePort* aEntangledPort); @@ -147,6 +149,8 @@ class MessagePort final : public DOMEventTargetHelper // Dispatch events from the Message Queue using a nsRunnable. void Dispatch(); + void DispatchError(); + void StartDisentangling(); void Disentangle(); diff --git a/dom/webidl/MessagePort.webidl b/dom/webidl/MessagePort.webidl index 6495b5616de7..df19470742a9 100644 --- a/dom/webidl/MessagePort.webidl +++ b/dom/webidl/MessagePort.webidl @@ -17,5 +17,6 @@ interface MessagePort : EventTarget { // event handlers attribute EventHandler onmessage; + attribute EventHandler onmessageerror; }; // MessagePort implements Transferable;