From 50ac42f57a8eb84fc161c8ac8ded10c1c79d1bde Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 7 Oct 2015 20:35:11 +0100 Subject: [PATCH] Bug 949376 - MessageEvent::initMessageEvent, r=smaug --- dom/events/MessageEvent.cpp | 45 +++++++++++++++++++++++++- dom/events/MessageEvent.h | 11 ++++++- dom/events/test/test_messageEvent.html | 39 ++++++++++++++-------- dom/messagechannel/MessagePortList.h | 2 +- dom/webidl/MessageEvent.webidl | 6 ++++ 5 files changed, 87 insertions(+), 16 deletions(-) diff --git a/dom/events/MessageEvent.cpp b/dom/events/MessageEvent.cpp index 29cb907678d9..08fe8b54c0d4 100644 --- a/dom/events/MessageEvent.cpp +++ b/dom/events/MessageEvent.cpp @@ -199,6 +199,49 @@ MessageEvent::InitMessageEvent(const nsAString& aType, return NS_OK; } +void +MessageEvent::InitMessageEvent(JSContext* aCx, const nsAString& aType, + bool aCanBubble, bool aCancelable, + JS::Handle aData, + const nsAString& aOrigin, + const nsAString& aLastEventId, + const Nullable& aSource, + const Nullable>>& aPorts, + ErrorResult& aRv) +{ + aRv = Event::InitEvent(aType, aCanBubble, aCancelable); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + mData = aData; + mozilla::HoldJSObjects(this); + mOrigin = aOrigin; + mLastEventId = aLastEventId; + + mWindowSource = nullptr; + mPortSource = nullptr; + + if (!aSource.IsNull()) { + if (aSource.Value().IsWindowProxy()) { + mWindowSource = aSource.Value().GetAsWindowProxy(); + } else { + mPortSource = &aSource.Value().GetAsMessagePort(); + } + } + + mPorts = nullptr; + + if (!aPorts.IsNull()) { + nsTArray> ports; + for (uint32_t i = 0, len = aPorts.Value().Length(); i < len; ++i) { + ports.AppendElement(aPorts.Value()[i]); + } + + mPorts = new MessagePortList(static_cast(this), ports); + } +} + void MessageEvent::SetPorts(MessagePortList* aPorts) { @@ -227,7 +270,7 @@ using namespace mozilla::dom; already_AddRefed NS_NewDOMMessageEvent(EventTarget* aOwner, nsPresContext* aPresContext, - WidgetEvent* aEvent) + WidgetEvent* aEvent) { nsRefPtr it = new MessageEvent(aOwner, aPresContext, aEvent); return it.forget(); diff --git a/dom/events/MessageEvent.h b/dom/events/MessageEvent.h index e2b4e1afcaa0..a435f1ae798a 100644 --- a/dom/events/MessageEvent.h +++ b/dom/events/MessageEvent.h @@ -8,9 +8,10 @@ #define mozilla_dom_MessageEvent_h_ #include "mozilla/dom/Event.h" +#include "mozilla/dom/BindingUtils.h" +#include "mozilla/dom/MessagePortList.h" #include "nsCycleCollectionParticipant.h" #include "nsIDOMMessageEvent.h" -#include "mozilla/dom/MessagePortList.h" namespace mozilla { namespace dom { @@ -19,6 +20,7 @@ struct MessageEventInit; class MessagePort; class MessagePortList; class OwningWindowProxyOrMessagePortOrClient; +class WindowProxyOrMessagePort; namespace workers { @@ -85,6 +87,13 @@ public: const MessageEventInit& aEventInit, ErrorResult& aRv); + void InitMessageEvent(JSContext* aCx, const nsAString& aType, bool aCanBubble, + bool aCancelable, JS::Handle aData, + const nsAString& aOrigin, const nsAString& aLastEventId, + const Nullable& aSource, + const Nullable>>& aPorts, + ErrorResult& aRv); + protected: ~MessageEvent(); diff --git a/dom/events/test/test_messageEvent.html b/dom/events/test/test_messageEvent.html index b8dc91f86645..249aa9e8c158 100644 --- a/dom/events/test/test_messageEvent.html +++ b/dom/events/test/test_messageEvent.html @@ -13,6 +13,23 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=848294