dom/events/MessageEvent.cpp

changeset 0
6474c204b198
     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 +}

mercurial