1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/events/MessageEvent.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,210 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "mozilla/dom/MessageEvent.h" 1.10 +#include "mozilla/dom/MessageEventBinding.h" 1.11 +#include "mozilla/dom/MessagePort.h" 1.12 +#include "mozilla/dom/MessagePortBinding.h" 1.13 +#include "mozilla/dom/MessagePortList.h" 1.14 +#include "mozilla/dom/UnionTypes.h" 1.15 + 1.16 +#include "mozilla/HoldDropJSObjects.h" 1.17 +#include "jsapi.h" 1.18 + 1.19 +namespace mozilla { 1.20 +namespace dom { 1.21 + 1.22 +NS_IMPL_CYCLE_COLLECTION_CLASS(MessageEvent) 1.23 + 1.24 +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MessageEvent, Event) 1.25 + tmp->mData = JSVAL_VOID; 1.26 + NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindowSource) 1.27 + NS_IMPL_CYCLE_COLLECTION_UNLINK(mPortSource) 1.28 + NS_IMPL_CYCLE_COLLECTION_UNLINK(mPorts) 1.29 +NS_IMPL_CYCLE_COLLECTION_UNLINK_END 1.30 + 1.31 +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MessageEvent, Event) 1.32 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindowSource) 1.33 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPortSource) 1.34 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPorts) 1.35 +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END 1.36 + 1.37 +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(MessageEvent, Event) 1.38 + NS_IMPL_CYCLE_COLLECTION_TRACE_JSVAL_MEMBER_CALLBACK(mData) 1.39 +NS_IMPL_CYCLE_COLLECTION_TRACE_END 1.40 + 1.41 +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MessageEvent) 1.42 + NS_INTERFACE_MAP_ENTRY(nsIDOMMessageEvent) 1.43 +NS_INTERFACE_MAP_END_INHERITING(Event) 1.44 + 1.45 +NS_IMPL_ADDREF_INHERITED(MessageEvent, Event) 1.46 +NS_IMPL_RELEASE_INHERITED(MessageEvent, Event) 1.47 + 1.48 +MessageEvent::MessageEvent(EventTarget* aOwner, 1.49 + nsPresContext* aPresContext, 1.50 + WidgetEvent* aEvent) 1.51 + : Event(aOwner, aPresContext, aEvent) 1.52 + , mData(JSVAL_VOID) 1.53 +{ 1.54 +} 1.55 + 1.56 +MessageEvent::~MessageEvent() 1.57 +{ 1.58 + mData = JSVAL_VOID; 1.59 + DropJSObjects(this); 1.60 +} 1.61 + 1.62 +JSObject* 1.63 +MessageEvent::WrapObject(JSContext* aCx) 1.64 +{ 1.65 + return mozilla::dom::MessageEventBinding::Wrap(aCx, this); 1.66 +} 1.67 + 1.68 +NS_IMETHODIMP 1.69 +MessageEvent::GetData(JSContext* aCx, JS::MutableHandle<JS::Value> aData) 1.70 +{ 1.71 + ErrorResult rv; 1.72 + GetData(aCx, aData, rv); 1.73 + return rv.ErrorCode(); 1.74 +} 1.75 + 1.76 +void 1.77 +MessageEvent::GetData(JSContext* aCx, JS::MutableHandle<JS::Value> aData, 1.78 + ErrorResult& aRv) 1.79 +{ 1.80 + JS::ExposeValueToActiveJS(mData); 1.81 + aData.set(mData); 1.82 + if (!JS_WrapValue(aCx, aData)) { 1.83 + aRv.Throw(NS_ERROR_FAILURE); 1.84 + } 1.85 +} 1.86 + 1.87 +NS_IMETHODIMP 1.88 +MessageEvent::GetOrigin(nsAString& aOrigin) 1.89 +{ 1.90 + aOrigin = mOrigin; 1.91 + return NS_OK; 1.92 +} 1.93 + 1.94 +NS_IMETHODIMP 1.95 +MessageEvent::GetLastEventId(nsAString& aLastEventId) 1.96 +{ 1.97 + aLastEventId = mLastEventId; 1.98 + return NS_OK; 1.99 +} 1.100 + 1.101 +NS_IMETHODIMP 1.102 +MessageEvent::GetSource(nsIDOMWindow** aSource) 1.103 +{ 1.104 + NS_IF_ADDREF(*aSource = mWindowSource); 1.105 + return NS_OK; 1.106 +} 1.107 + 1.108 +void 1.109 +MessageEvent::GetSource(Nullable<OwningWindowProxyOrMessagePort>& aValue) const 1.110 +{ 1.111 + if (mWindowSource) { 1.112 + aValue.SetValue().SetAsWindowProxy() = mWindowSource; 1.113 + } else if (mPortSource) { 1.114 + aValue.SetValue().SetAsMessagePort() = mPortSource; 1.115 + } 1.116 +} 1.117 + 1.118 +/* static */ already_AddRefed<MessageEvent> 1.119 +MessageEvent::Constructor(const GlobalObject& aGlobal, 1.120 + JSContext* aCx, const nsAString& aType, 1.121 + const MessageEventInit& aParam, 1.122 + ErrorResult& aRv) 1.123 +{ 1.124 + nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports()); 1.125 + nsRefPtr<MessageEvent> event = new MessageEvent(t, nullptr, nullptr); 1.126 + 1.127 + aRv = event->InitEvent(aType, aParam.mBubbles, aParam.mCancelable); 1.128 + if (aRv.Failed()) { 1.129 + return nullptr; 1.130 + } 1.131 + 1.132 + bool trusted = event->Init(t); 1.133 + event->SetTrusted(trusted); 1.134 + 1.135 + event->mData = aParam.mData; 1.136 + 1.137 + mozilla::HoldJSObjects(event.get()); 1.138 + 1.139 + if (aParam.mOrigin.WasPassed()) { 1.140 + event->mOrigin = aParam.mOrigin.Value(); 1.141 + } 1.142 + 1.143 + if (aParam.mLastEventId.WasPassed()) { 1.144 + event->mLastEventId = aParam.mLastEventId.Value(); 1.145 + } 1.146 + 1.147 + if (!aParam.mSource.IsNull()) { 1.148 + if (aParam.mSource.Value().IsWindowProxy()) { 1.149 + event->mWindowSource = aParam.mSource.Value().GetAsWindowProxy(); 1.150 + } else { 1.151 + event->mPortSource = aParam.mSource.Value().GetAsMessagePort(); 1.152 + } 1.153 + 1.154 + MOZ_ASSERT(event->mWindowSource || event->mPortSource); 1.155 + } 1.156 + 1.157 + if (aParam.mPorts.WasPassed() && !aParam.mPorts.Value().IsNull()) { 1.158 + nsTArray<nsRefPtr<MessagePortBase>> ports; 1.159 + for (uint32_t i = 0, len = aParam.mPorts.Value().Value().Length(); i < len; ++i) { 1.160 + ports.AppendElement(aParam.mPorts.Value().Value()[i].get()); 1.161 + } 1.162 + 1.163 + event->mPorts = new MessagePortList(static_cast<EventBase*>(event), ports); 1.164 + } 1.165 + 1.166 + return event.forget(); 1.167 +} 1.168 + 1.169 +NS_IMETHODIMP 1.170 +MessageEvent::InitMessageEvent(const nsAString& aType, 1.171 + bool aCanBubble, 1.172 + bool aCancelable, 1.173 + JS::Handle<JS::Value> aData, 1.174 + const nsAString& aOrigin, 1.175 + const nsAString& aLastEventId, 1.176 + nsIDOMWindow* aSource) 1.177 +{ 1.178 + nsresult rv = Event::InitEvent(aType, aCanBubble, aCancelable); 1.179 + NS_ENSURE_SUCCESS(rv, rv); 1.180 + 1.181 + mData = aData; 1.182 + mozilla::HoldJSObjects(this); 1.183 + mOrigin = aOrigin; 1.184 + mLastEventId = aLastEventId; 1.185 + mWindowSource = aSource; 1.186 + 1.187 + return NS_OK; 1.188 +} 1.189 + 1.190 +void 1.191 +MessageEvent::SetPorts(MessagePortList* aPorts) 1.192 +{ 1.193 + MOZ_ASSERT(!mPorts && aPorts); 1.194 + mPorts = aPorts; 1.195 +} 1.196 + 1.197 +} // namespace dom 1.198 +} // namespace mozilla 1.199 + 1.200 +using namespace mozilla; 1.201 +using namespace mozilla::dom; 1.202 + 1.203 +nsresult 1.204 +NS_NewDOMMessageEvent(nsIDOMEvent** aInstancePtrResult, 1.205 + EventTarget* aOwner, 1.206 + nsPresContext* aPresContext, 1.207 + WidgetEvent* aEvent) 1.208 +{ 1.209 + MessageEvent* it = new MessageEvent(aOwner, aPresContext, aEvent); 1.210 + NS_ADDREF(it); 1.211 + *aInstancePtrResult = static_cast<Event*>(it); 1.212 + return NS_OK; 1.213 +}