From 98851f79cea1595a5575ad4806b12faec6aba8d9 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Tue, 26 Aug 2014 16:33:42 -0700 Subject: [PATCH] Backed out 4 changesets (bug 745283) for conflicting with the backout of bug 786419 a=backout Backed out changeset a1af198d91bd (bug 745283) Backed out changeset 9fc6f4275bbb (bug 745283) Backed out changeset 37c10c9f2a4d (bug 745283) Backed out changeset bc0ab47e8ac7 (bug 745283) --HG-- rename : netwerk/test/unit/test_udpsocket.js => netwerk/test/unit/test_bug952927.js --- b2g/app/b2g.js | 3 - dom/apps/src/PermissionsTable.jsm | 5 - dom/network/interfaces/nsIUDPSocketChild.idl | 29 +- dom/network/src/PUDPSocket.ipdl | 46 +- dom/network/src/UDPSocket.cpp | 705 ------------------ dom/network/src/UDPSocket.h | 197 ----- dom/network/src/UDPSocketChild.cpp | 171 ++--- dom/network/src/UDPSocketChild.h | 15 +- dom/network/src/UDPSocketParent.cpp | 379 ++++------ dom/network/src/UDPSocketParent.h | 25 +- dom/network/src/moz.build | 5 - dom/network/tests/file_udpsocket_iframe.html | 23 - dom/network/tests/mochitest.ini | 5 - dom/network/tests/test_udpsocket.html | 409 ---------- dom/permission/tests/mochitest.ini | 1 - dom/permission/tests/test_udp-socket.html | 47 -- .../mochitest/general/test_interfaces.html | 4 - dom/webidl/SocketCommon.webidl | 16 - dom/webidl/UDPMessageEvent.webidl | 24 - dom/webidl/UDPSocket.webidl | 40 - dom/webidl/moz.build | 4 - media/mtransport/nr_socket_prsock.cpp | 150 ++-- modules/libpref/init/all.js | 3 - netwerk/base/public/nsIUDPSocket.idl | 41 +- netwerk/base/src/nsUDPSocket.cpp | 93 +-- netwerk/ipc/NeckoChild.cpp | 4 +- netwerk/ipc/NeckoChild.h | 4 +- netwerk/ipc/NeckoParent.cpp | 36 +- netwerk/ipc/NeckoParent.h | 9 +- netwerk/ipc/PNecko.ipdl | 2 +- netwerk/test/TestUDPSocket.cpp | 4 +- netwerk/test/unit/test_bug952927.js | 31 + netwerk/test/unit/test_udpsocket.js | 61 -- netwerk/test/unit/xpcshell.ini | 2 +- 34 files changed, 419 insertions(+), 2174 deletions(-) delete mode 100644 dom/network/src/UDPSocket.cpp delete mode 100644 dom/network/src/UDPSocket.h delete mode 100644 dom/network/tests/file_udpsocket_iframe.html delete mode 100644 dom/network/tests/test_udpsocket.html delete mode 100644 dom/permission/tests/test_udp-socket.html delete mode 100644 dom/webidl/SocketCommon.webidl delete mode 100644 dom/webidl/UDPMessageEvent.webidl delete mode 100644 dom/webidl/UDPSocket.webidl create mode 100644 netwerk/test/unit/test_bug952927.js delete mode 100644 netwerk/test/unit/test_udpsocket.js diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 839f7f08179..7e3622f2e99 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -1013,6 +1013,3 @@ pref("services.mobileid.server.uri", "https://msisdn.services.mozilla.com"); #ifndef XP_WIN pref("dom.mapped_arraybuffer.enabled", true); #endif - -// UDPSocket API -pref("dom.udpsocket.enabled", true); diff --git a/dom/apps/src/PermissionsTable.jsm b/dom/apps/src/PermissionsTable.jsm index 5fb19bb2f9d..2b09c8277f6 100644 --- a/dom/apps/src/PermissionsTable.jsm +++ b/dom/apps/src/PermissionsTable.jsm @@ -52,11 +52,6 @@ this.PermissionsTable = { geolocation: { privileged: ALLOW_ACTION, certified: ALLOW_ACTION }, - "udp-socket": { - app: DENY_ACTION, - privileged: ALLOW_ACTION, - certified: ALLOW_ACTION - }, "network-events": { app: DENY_ACTION, privileged: DENY_ACTION, diff --git a/dom/network/interfaces/nsIUDPSocketChild.idl b/dom/network/interfaces/nsIUDPSocketChild.idl index 75b0a4b72eb..9c7caa19ea9 100644 --- a/dom/network/interfaces/nsIUDPSocketChild.idl +++ b/dom/network/interfaces/nsIUDPSocketChild.idl @@ -6,7 +6,6 @@ #include "nsINetAddr.idl" interface nsIUDPSocketInternal; -interface nsIInputStream; %{ C++ namespace mozilla { @@ -18,7 +17,7 @@ union NetAddr; native NetAddr(mozilla::net::NetAddr); [ptr] native NetAddrPtr(mozilla::net::NetAddr); -[scriptable, uuid(5bb7de5a-8766-4c13-b9ed-14e63168dabf)] +[scriptable, uuid(B47E5A0F-D384-48EF-8885-4259793D9CF0)] interface nsIUDPSocketChild : nsISupports { readonly attribute unsigned short localPort; @@ -26,8 +25,7 @@ interface nsIUDPSocketChild : nsISupports attribute AUTF8String filterName; // Tell the chrome process to bind the UDP socket to a given local host and port - void bind(in nsIUDPSocketInternal socket, in AUTF8String host, in unsigned short port, - in bool addressReuse, in bool loopback); + void bind(in nsIUDPSocketInternal socket, in AUTF8String host, in unsigned short port); // Tell the chrome process to perform equivalent operations to all following methods void send(in AUTF8String host, in unsigned short port, @@ -40,28 +38,21 @@ interface nsIUDPSocketChild : nsISupports [noscript] void sendWithAddress([const] in NetAddrPtr addr, [const, array, size_is(byteLength)] in uint8_t bytes, in unsigned long byteLength); - // Send input stream. This must be a buffered stream implementation. - void sendBinaryStream(in AUTF8String host, in unsigned short port, in nsIInputStream stream); - void close(); - void joinMulticast(in AUTF8String multicastAddress, in AUTF8String iface); - void leaveMulticast(in AUTF8String multicastAddress, in AUTF8String iface); }; /* * Internal interface for callback from chrome process */ -[scriptable, uuid(44cd9ad5-d574-4169-baf9-e1af0648a143)] +[scriptable, uuid(1E27E9B3-C1C8-4B05-A415-1A2C1A641C60)] interface nsIUDPSocketInternal : nsISupports { - // callback while socket is opened. localPort and localAddress is ready until this time. - void callListenerOpened(); - // callback while socket is closed. - void callListenerClosed(); - // callback while incoming packet is received. - void callListenerReceivedData(in AUTF8String host, in unsigned short port, - [const, array, size_is(dataLength)] in uint8_t data, + void callListenerError(in AUTF8String type, in AUTF8String message, in AUTF8String filename, + in uint32_t lineNumber, in uint32_t columnNumber); + void callListenerReceivedData(in AUTF8String type, in AUTF8String host, in unsigned short port, + [array, size_is(dataLength)] in uint8_t data, in unsigned long dataLength); - // callback while any error happened. - void callListenerError(in AUTF8String message, in AUTF8String filename, in uint32_t lineNumber); + void callListenerVoid(in AUTF8String type); + void callListenerSent(in AUTF8String type, in nsresult status); + void updateReadyState(in AUTF8String readyState); }; diff --git a/dom/network/src/PUDPSocket.ipdl b/dom/network/src/PUDPSocket.ipdl index 215d8f4e4e0..a7bffc8118e 100644 --- a/dom/network/src/PUDPSocket.ipdl +++ b/dom/network/src/PUDPSocket.ipdl @@ -6,8 +6,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ include protocol PNecko; -include protocol PBlob; -include InputStreamParams; include "mozilla/net/NeckoMessageUtils.h"; include "mozilla/net/DNS.h"; @@ -16,19 +14,34 @@ include "prio.h"; using mozilla::net::NetAddr from "mozilla/net/DNS.h"; using struct mozilla::void_t from "ipc/IPCMessageUtils.h"; +struct UDPError { + nsCString message; + nsCString filename; + uint32_t lineNumber; + uint32_t columnNumber; +}; + +struct UDPMessage { + nsCString fromAddr; + uint16_t port; + uint8_t[] data; +}; + struct UDPAddressInfo { - nsCString addr; + nsCString local; uint16_t port; }; -union UDPSocketAddr { - UDPAddressInfo; - NetAddr; +struct UDPSendResult { + nsresult value; }; -union UDPData { - uint8_t[]; - InputStreamParams; +union UDPCallbackData { + void_t; + UDPMessage; + UDPAddressInfo; + UDPSendResult; + UDPError; }; namespace mozilla { @@ -40,22 +53,13 @@ protocol PUDPSocket manager PNecko; parent: - Bind(UDPAddressInfo addressInfo, bool addressReuse, bool loopback); - - OutgoingData(UDPData data, UDPSocketAddr addr); - - JoinMulticast(nsCString multicastAddress, nsCString iface); - LeaveMulticast(nsCString multicastAddress, nsCString iface); - + Data(uint8_t[] data, nsCString remoteAddress, uint16_t port); + DataWithAddress(uint8_t[] data, NetAddr addr); Close(); - RequestDelete(); child: - CallbackOpened(UDPAddressInfo addressInfo); - CallbackClosed(); - CallbackReceivedData(UDPAddressInfo addressInfo, uint8_t[] data); - CallbackError(nsCString message, nsCString filename, uint32_t lineNumber); + Callback(nsCString type, UDPCallbackData data, nsCString aState); __delete__(); }; diff --git a/dom/network/src/UDPSocket.cpp b/dom/network/src/UDPSocket.cpp deleted file mode 100644 index a01449630d8..00000000000 --- a/dom/network/src/UDPSocket.cpp +++ /dev/null @@ -1,705 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "UDPSocket.h" -#include "mozilla/AsyncEventDispatcher.h" -#include "mozilla/dom/ErrorEvent.h" -#include "mozilla/dom/UDPMessageEvent.h" -#include "mozilla/dom/UDPSocketBinding.h" -#include "mozilla/dom/UnionTypes.h" -#include "mozilla/net/DNS.h" -#include "nsComponentManagerUtils.h" -#include "nsContentUtils.h" -#include "nsIDOMFile.h" -#include "nsINetAddr.h" -#include "nsStringStream.h" - -namespace mozilla { -namespace dom { - -NS_IMPL_CYCLE_COLLECTION_CLASS(UDPSocket) - -NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(UDPSocket, DOMEventTargetHelper) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOpened) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mClosed) -NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END - -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(UDPSocket, DOMEventTargetHelper) - NS_IMPL_CYCLE_COLLECTION_UNLINK(mOpened) - NS_IMPL_CYCLE_COLLECTION_UNLINK(mClosed) - tmp->CloseWithReason(NS_OK); -NS_IMPL_CYCLE_COLLECTION_UNLINK_END - -NS_IMPL_ADDREF_INHERITED(UDPSocket, DOMEventTargetHelper) -NS_IMPL_RELEASE_INHERITED(UDPSocket, DOMEventTargetHelper) - -NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(UDPSocket) - NS_INTERFACE_MAP_ENTRY(nsIUDPSocketListener) - NS_INTERFACE_MAP_ENTRY(nsIUDPSocketInternal) -NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) - -/* static */ already_AddRefed -UDPSocket::Constructor(const GlobalObject& aGlobal, - const UDPOptions& aOptions, - ErrorResult& aRv) -{ - nsCOMPtr ownerWindow = do_QueryInterface(aGlobal.GetAsSupports()); - if (!ownerWindow) { - aRv.Throw(NS_ERROR_FAILURE); - return nullptr; - } - - bool addressReuse = aOptions.mAddressReuse; - bool loopback = aOptions.mLoopback; - - nsCString remoteAddress; - if (aOptions.mRemoteAddress.WasPassed()) { - remoteAddress = NS_ConvertUTF16toUTF8(aOptions.mRemoteAddress.Value()); - } else { - remoteAddress.SetIsVoid(true); - } - - Nullable remotePort; - if (aOptions.mRemotePort.WasPassed()) { - remotePort.SetValue(aOptions.mRemotePort.Value()); - - if (remotePort.Value() == 0) { - aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); - return nullptr; - } - } - - nsString localAddress; - if (aOptions.mLocalAddress.WasPassed()) { - localAddress = aOptions.mLocalAddress.Value(); - - // check if localAddress is a valid IPv4/6 address - NS_ConvertUTF16toUTF8 address(localAddress); - PRNetAddr prAddr; - PRStatus status = PR_StringToNetAddr(address.BeginReading(), &prAddr); - if (status != PR_SUCCESS) { - aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); - return nullptr; - } - } else { - SetDOMStringToNull(localAddress); - } - - Nullable localPort; - if (aOptions.mLocalPort.WasPassed()) { - localPort.SetValue(aOptions.mLocalPort.Value()); - - if (localPort.Value() == 0) { - aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); - return nullptr; - } - } - - nsRefPtr socket = new UDPSocket(ownerWindow, remoteAddress, remotePort); - aRv = socket->Init(localAddress, localPort, addressReuse, loopback); - - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - - return socket.forget(); -} - -UDPSocket::UDPSocket(nsPIDOMWindow* aOwner, - const nsCString& aRemoteAddress, - const Nullable& aRemotePort) - : DOMEventTargetHelper(aOwner) - , mRemoteAddress(aRemoteAddress) - , mRemotePort(aRemotePort) - , mReadyState(SocketReadyState::Opening) -{ - MOZ_ASSERT(aOwner); - MOZ_ASSERT(aOwner->IsInnerWindow()); - - nsIDocument* aDoc = aOwner->GetExtantDoc(); - if (aDoc) { - aDoc->DisallowBFCaching(); - } -} - -UDPSocket::~UDPSocket() -{ - CloseWithReason(NS_OK); -} - -JSObject* -UDPSocket::WrapObject(JSContext* aCx) -{ - return UDPSocketBinding::Wrap(aCx, this); -} - -void -UDPSocket::DisconnectFromOwner() -{ - DOMEventTargetHelper::DisconnectFromOwner(); - CloseWithReason(NS_OK); -} - -already_AddRefed -UDPSocket::Close() -{ - MOZ_ASSERT(mClosed); - - nsRefPtr promise = mClosed; - - if (mReadyState == SocketReadyState::Closed) { - return promise.forget(); - } - - CloseWithReason(NS_OK); - return promise.forget(); -} - -void -UDPSocket::CloseWithReason(nsresult aReason) -{ - if (mReadyState == SocketReadyState::Closed) { - return; - } - - if (mOpened) { - if (mReadyState == SocketReadyState::Opening) { - // reject openedPromise with AbortError if socket is closed without error - nsresult openFailedReason = NS_FAILED(aReason) ? aReason : NS_ERROR_DOM_ABORT_ERR; - mOpened->MaybeReject(openFailedReason); - } - } - - mReadyState = SocketReadyState::Closed; - - if (mSocket) { - mSocket->Close(); - mSocket = nullptr; - } - - if (mSocketChild) { - mSocketChild->Close(); - mSocketChild = nullptr; - } - - if (mClosed) { - if (NS_SUCCEEDED(aReason)) { - mClosed->MaybeResolve(JS::UndefinedHandleValue); - } else { - mClosed->MaybeReject(aReason); - } - } - - mPendingMcastCommands.Clear(); -} - -void -UDPSocket::JoinMulticastGroup(const nsAString& aMulticastGroupAddress, - ErrorResult& aRv) -{ - if (mReadyState == SocketReadyState::Closed) { - aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); - return; - } - - if (mReadyState == SocketReadyState::Opening) { - MulticastCommand joinCommand(MulticastCommand::Join, aMulticastGroupAddress); - mPendingMcastCommands.AppendElement(joinCommand); - return; - } - - MOZ_ASSERT(mSocket || mSocketChild); - - NS_ConvertUTF16toUTF8 address(aMulticastGroupAddress); - - if (mSocket) { - MOZ_ASSERT(!mSocketChild); - - aRv = mSocket->JoinMulticast(address, EmptyCString()); - NS_WARN_IF(aRv.Failed()); - - return; - } - - MOZ_ASSERT(mSocketChild); - - aRv = mSocketChild->JoinMulticast(address, EmptyCString()); - NS_WARN_IF(aRv.Failed()); -} - -void -UDPSocket::LeaveMulticastGroup(const nsAString& aMulticastGroupAddress, - ErrorResult& aRv) -{ - if (mReadyState == SocketReadyState::Closed) { - aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); - return; - } - - if (mReadyState == SocketReadyState::Opening) { - MulticastCommand leaveCommand(MulticastCommand::Leave, aMulticastGroupAddress); - mPendingMcastCommands.AppendElement(leaveCommand); - return; - } - - MOZ_ASSERT(mSocket || mSocketChild); - - nsCString address = NS_ConvertUTF16toUTF8(aMulticastGroupAddress); - if (mSocket) { - MOZ_ASSERT(!mSocketChild); - - aRv = mSocket->LeaveMulticast(address, EmptyCString()); - NS_WARN_IF(aRv.Failed()); - return; - } - - MOZ_ASSERT(mSocketChild); - - aRv = mSocketChild->LeaveMulticast(address, EmptyCString()); - NS_WARN_IF(aRv.Failed()); -} - -nsresult -UDPSocket::DoPendingMcastCommand() -{ - MOZ_ASSERT(mReadyState == SocketReadyState::Open, "Multicast command can only be executed after socket opened"); - - for (uint32_t i = 0; i < mPendingMcastCommands.Length(); ++i) { - MulticastCommand& command = mPendingMcastCommands[i]; - ErrorResult rv; - - switch (command.mCommand) { - case MulticastCommand::Join: { - JoinMulticastGroup(command.mAddress, rv); - break; - } - case MulticastCommand::Leave: { - LeaveMulticastGroup(command.mAddress, rv); - break; - } - } - - if (NS_WARN_IF(rv.Failed())) { - return rv.ErrorCode(); - } - } - - mPendingMcastCommands.Clear(); - return NS_OK; -} - -bool -UDPSocket::Send(const StringOrBlobOrArrayBufferOrArrayBufferView& aData, - const Optional& aRemoteAddress, - const Optional>& aRemotePort, - ErrorResult& aRv) -{ - if (mReadyState != SocketReadyState::Open) { - aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); - return false; - } - - MOZ_ASSERT(mSocket || mSocketChild); - - // If the remote address and port were not specified in the constructor or as arguments, - // throw InvalidAccessError. - nsCString remoteAddress; - if (aRemoteAddress.WasPassed()) { - remoteAddress = NS_ConvertUTF16toUTF8(aRemoteAddress.Value()); - } else if (!mRemoteAddress.IsVoid()) { - remoteAddress = mRemoteAddress; - } else { - aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); - return false; - } - - uint16_t remotePort; - if (aRemotePort.WasPassed() && !aRemotePort.Value().IsNull()) { - remotePort = aRemotePort.Value().Value(); - } else if (!mRemotePort.IsNull()) { - remotePort = mRemotePort.Value(); - } else { - aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); - return false; - } - - nsCOMPtr stream; - if (aData.IsBlob()) { - nsCOMPtr blob = aData.GetAsBlob(); - - aRv = blob->GetInternalStream(getter_AddRefs(stream)); - if (NS_WARN_IF(aRv.Failed())) { - return false; - } - } else { - nsresult rv; - nsCOMPtr strStream = do_CreateInstance(NS_STRINGINPUTSTREAM_CONTRACTID, &rv); - if (NS_WARN_IF(NS_FAILED(rv))) { - aRv.Throw(rv); - return false; - } - - if (aData.IsString()) { - NS_ConvertUTF16toUTF8 data(aData.GetAsString()); - aRv = strStream->SetData(data.BeginReading(), data.Length()); - } else if (aData.IsArrayBuffer()) { - const ArrayBuffer& data = aData.GetAsArrayBuffer(); - data.ComputeLengthAndData(); - aRv = strStream->SetData(reinterpret_cast(data.Data()), data.Length()); - } else { - const ArrayBufferView& data = aData.GetAsArrayBufferView(); - data.ComputeLengthAndData(); - aRv = strStream->SetData(reinterpret_cast(data.Data()), data.Length()); - } - - if (NS_WARN_IF(aRv.Failed())) { - return false; - } - - stream = strStream; - } - - if (mSocket) { - aRv = mSocket->SendBinaryStream(remoteAddress, remotePort, stream); - } else if (mSocketChild) { - aRv = mSocketChild->SendBinaryStream(remoteAddress, remotePort, stream); - } - - if (NS_WARN_IF(aRv.Failed())) { - return false; - } - - return true; -} - -nsresult -UDPSocket::InitLocal(const nsAString& aLocalAddress, - const uint16_t& aLocalPort) -{ - nsresult rv; - - nsCOMPtr sock = - do_CreateInstance("@mozilla.org/network/udp-socket;1", &rv); - if (NS_FAILED(rv)) { - return rv; - } - - if (aLocalAddress.IsEmpty()) { - rv = sock->Init(aLocalPort, /* loopback = */ false, mAddressReuse, /* optionalArgc = */ 1); - } else { - PRNetAddr prAddr; - PR_InitializeNetAddr(PR_IpAddrAny, aLocalPort, &prAddr); - PR_StringToNetAddr(NS_ConvertUTF16toUTF8(aLocalAddress).BeginReading(), &prAddr); - - mozilla::net::NetAddr addr; - PRNetAddrToNetAddr(&prAddr, &addr); - rv = sock->InitWithAddress(&addr, mAddressReuse, /* optionalArgc = */ 1); - } - if (NS_FAILED(rv)) { - return rv; - } - - rv = sock->SetMulticastLoopback(mLoopback); - if (NS_FAILED(rv)) { - return rv; - } - - mSocket = sock; - - // Get real local address and local port - nsCOMPtr localAddr; - rv = mSocket->GetLocalAddr(getter_AddRefs(localAddr)); - if (NS_FAILED(rv)) { - return rv; - } - - nsCString localAddress; - rv = localAddr->GetAddress(localAddress); - if (NS_FAILED(rv)) { - return rv; - } - mLocalAddress = NS_ConvertUTF8toUTF16(localAddress); - - uint16_t localPort; - rv = localAddr->GetPort(&localPort); - if (NS_FAILED(rv)) { - return rv; - } - mLocalPort.SetValue(localPort); - - rv = mSocket->AsyncListen(this); - if (NS_FAILED(rv)) { - return rv; - } - - mReadyState = SocketReadyState::Open; - rv = DoPendingMcastCommand(); - if (NS_FAILED(rv)) { - return rv; - } - - mOpened->MaybeResolve(JS::UndefinedHandleValue); - - return NS_OK; -} - -nsresult -UDPSocket::InitRemote(const nsAString& aLocalAddress, - const uint16_t& aLocalPort) -{ - nsresult rv; - - nsCOMPtr sock = - do_CreateInstance("@mozilla.org/udp-socket-child;1", &rv); - if (NS_FAILED(rv)) { - return rv; - } - - rv = sock->Bind(this, NS_ConvertUTF16toUTF8(aLocalAddress), aLocalPort, mAddressReuse, mLoopback); - if (NS_FAILED(rv)) { - return rv; - } - - mSocketChild = sock; - - return NS_OK; -} - -nsresult -UDPSocket::Init(const nsString& aLocalAddress, - const Nullable& aLocalPort, - const bool& aAddressReuse, - const bool& aLoopback) -{ - MOZ_ASSERT(!mSocket && !mSocketChild); - - mLocalAddress = aLocalAddress; - mLocalPort = aLocalPort; - mAddressReuse = aAddressReuse; - mLoopback = aLoopback; - - ErrorResult rv; - nsCOMPtr global = do_QueryInterface(GetOwner()); - - mOpened = Promise::Create(global, rv); - if (NS_WARN_IF(rv.Failed())) { - return rv.ErrorCode(); - } - - mClosed = Promise::Create(global, rv); - if (NS_WARN_IF(rv.Failed())) { - return rv.ErrorCode(); - } - - class OpenSocketRunnable MOZ_FINAL : public nsRunnable - { - public: - OpenSocketRunnable(UDPSocket* aSocket) : mSocket(aSocket) - { } - - NS_IMETHOD Run() MOZ_OVERRIDE - { - MOZ_ASSERT(mSocket); - - if (mSocket->mReadyState != SocketReadyState::Opening) { - return NS_OK; - } - - uint16_t localPort = 0; - if (!mSocket->mLocalPort.IsNull()) { - localPort = mSocket->mLocalPort.Value(); - } - - nsresult rv; - if (XRE_GetProcessType() != GeckoProcessType_Default) { - rv = mSocket->InitRemote(mSocket->mLocalAddress, localPort); - } else { - rv = mSocket->InitLocal(mSocket->mLocalAddress, localPort); - } - - if (NS_WARN_IF(NS_FAILED(rv))) { - mSocket->CloseWithReason(NS_ERROR_DOM_NETWORK_ERR); - } - - return NS_OK; - } - - private: - nsRefPtr mSocket; - }; - - nsCOMPtr runnable = new OpenSocketRunnable(this); - - return NS_DispatchToMainThread(runnable); -} - -void -UDPSocket::HandleReceivedData(const nsACString& aRemoteAddress, - const uint16_t& aRemotePort, - const uint8_t* aData, - const uint32_t& aDataLength) -{ - if (mReadyState != SocketReadyState::Open) { - return; - } - - if (NS_FAILED(CheckInnerWindowCorrectness())) { - return; - } - - if (NS_FAILED(DispatchReceivedData(aRemoteAddress, aRemotePort, aData, aDataLength))) { - CloseWithReason(NS_ERROR_TYPE_ERR); - } -} - -nsresult -UDPSocket::DispatchReceivedData(const nsACString& aRemoteAddress, - const uint16_t& aRemotePort, - const uint8_t* aData, - const uint32_t& aDataLength) -{ - AutoJSAPI jsapi; - - if (NS_WARN_IF(!jsapi.Init(GetOwner()))) { - return NS_ERROR_FAILURE; - } - - JSContext* cx = jsapi.cx(); - - // Copy packet data to ArrayBuffer - JS::Rooted arrayBuf(cx, ArrayBuffer::Create(cx, aDataLength, aData)); - - if (NS_WARN_IF(!arrayBuf)) { - return NS_ERROR_FAILURE; - } - - JS::Rooted jsData(cx, JS::ObjectValue(*arrayBuf)); - - // Create DOM event - RootedDictionary init(cx); - init.mRemoteAddress = NS_ConvertUTF8toUTF16(aRemoteAddress); - init.mRemotePort = aRemotePort; - init.mData = jsData; - - nsRefPtr udpEvent = - UDPMessageEvent::Constructor(this, NS_LITERAL_STRING("message"), init); - - if (NS_WARN_IF(!udpEvent)) { - return NS_ERROR_FAILURE; - } - - udpEvent->SetTrusted(true); - - nsRefPtr asyncDispatcher = new AsyncEventDispatcher(this, udpEvent); - - return asyncDispatcher->PostDOMEvent(); -} - -// nsIUDPSocketListener - -NS_IMETHODIMP -UDPSocket::OnPacketReceived(nsIUDPSocket* aSocket, nsIUDPMessage* aMessage) -{ - // nsIUDPSocketListener callbacks should be invoked on main thread. - MOZ_ASSERT(NS_IsMainThread(), "Not running on main thread"); - - // Create appropriate JS object for message - FallibleTArray& buffer = aMessage->GetDataAsTArray(); - - nsCOMPtr addr; - if (NS_WARN_IF(NS_FAILED(aMessage->GetFromAddr(getter_AddRefs(addr))))) { - return NS_OK; - } - - nsCString remoteAddress; - if (NS_WARN_IF(NS_FAILED(addr->GetAddress(remoteAddress)))) { - return NS_OK; - } - - uint16_t remotePort; - if (NS_WARN_IF(NS_FAILED(addr->GetPort(&remotePort)))) { - return NS_OK; - } - - HandleReceivedData(remoteAddress, remotePort, buffer.Elements(), buffer.Length()); - return NS_OK; -} - -NS_IMETHODIMP -UDPSocket::OnStopListening(nsIUDPSocket* aSocket, nsresult aStatus) -{ - // nsIUDPSocketListener callbacks should be invoked on main thread. - MOZ_ASSERT(NS_IsMainThread(), "Not running on main thread"); - - CloseWithReason(aStatus); - - return NS_OK; -} - -// nsIUDPSocketInternal - -NS_IMETHODIMP -UDPSocket::CallListenerError(const nsACString& aMessage, - const nsACString& aFilename, - uint32_t aLineNumber) -{ - CloseWithReason(NS_ERROR_DOM_NETWORK_ERR); - - return NS_OK; -} - -NS_IMETHODIMP -UDPSocket::CallListenerReceivedData(const nsACString& aRemoteAddress, - uint16_t aRemotePort, - const uint8_t* aData, - uint32_t aDataLength) -{ - HandleReceivedData(aRemoteAddress, aRemotePort, aData, aDataLength); - - return NS_OK; -} - -NS_IMETHODIMP -UDPSocket::CallListenerOpened() -{ - if (mReadyState != SocketReadyState::Opening) { - return NS_OK; - } - - MOZ_ASSERT(mSocketChild); - - // Get real local address and local port - nsCString localAddress; - mSocketChild->GetLocalAddress(localAddress); - mLocalAddress = NS_ConvertUTF8toUTF16(localAddress); - - uint16_t localPort; - mSocketChild->GetLocalPort(&localPort); - mLocalPort.SetValue(localPort); - - mReadyState = SocketReadyState::Open; - nsresult rv = DoPendingMcastCommand(); - - if (NS_WARN_IF(NS_FAILED(rv))) { - CloseWithReason(rv); - return NS_OK; - } - - mOpened->MaybeResolve(JS::UndefinedHandleValue); - - return NS_OK; -} - -NS_IMETHODIMP -UDPSocket::CallListenerClosed() -{ - CloseWithReason(NS_OK); - - return NS_OK; -} - -} // namespace dom -} // namespace mozilla diff --git a/dom/network/src/UDPSocket.h b/dom/network/src/UDPSocket.h deleted file mode 100644 index 0b92be3f980..00000000000 --- a/dom/network/src/UDPSocket.h +++ /dev/null @@ -1,197 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_dom_UDPSocket_h__ -#define mozilla_dom_UDPSocket_h__ - -#include "mozilla/Attributes.h" -#include "mozilla/DOMEventTargetHelper.h" -#include "mozilla/ErrorResult.h" -#include "mozilla/dom/Promise.h" -#include "mozilla/dom/SocketCommonBinding.h" -#include "nsIUDPSocket.h" -#include "nsIUDPSocketChild.h" -#include "nsTArray.h" - -struct JSContext; - -namespace mozilla { -namespace dom { - -struct UDPOptions; -class StringOrBlobOrArrayBufferOrArrayBufferView; - -class UDPSocket MOZ_FINAL : public DOMEventTargetHelper - , public nsIUDPSocketListener - , public nsIUDPSocketInternal -{ -public: - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(UDPSocket, DOMEventTargetHelper) - NS_DECL_NSIUDPSOCKETLISTENER - NS_DECL_NSIUDPSOCKETINTERNAL - NS_REALLY_FORWARD_NSIDOMEVENTTARGET(DOMEventTargetHelper) - -public: - nsPIDOMWindow* - GetParentObject() const - { - return GetOwner(); - } - - virtual JSObject* - WrapObject(JSContext* aCx) MOZ_OVERRIDE; - - virtual void - DisconnectFromOwner() MOZ_OVERRIDE; - - static already_AddRefed - Constructor(const GlobalObject& aGlobal, const UDPOptions& aOptions, ErrorResult& aRv); - - void - GetLocalAddress(nsString& aRetVal) const - { - aRetVal = mLocalAddress; - } - - Nullable - GetLocalPort() const - { - return mLocalPort; - } - - void - GetRemoteAddress(nsString& aRetVal) const - { - if (mRemoteAddress.IsVoid()) { - SetDOMStringToNull(aRetVal); - return; - } - - aRetVal = NS_ConvertUTF8toUTF16(mRemoteAddress); - } - - Nullable - GetRemotePort() const - { - return mRemotePort; - } - - bool - AddressReuse() const - { - return mAddressReuse; - } - - bool - Loopback() const - { - return mLoopback; - } - - SocketReadyState - ReadyState() const - { - return mReadyState; - } - - Promise* - Opened() const - { - return mOpened; - } - - Promise* - Closed() const - { - return mClosed; - } - - IMPL_EVENT_HANDLER(message) - - already_AddRefed - Close(); - - void - JoinMulticastGroup(const nsAString& aMulticastGroupAddress, ErrorResult& aRv); - - void - LeaveMulticastGroup(const nsAString& aMulticastGroupAddress, ErrorResult& aRv); - - bool - Send(const StringOrBlobOrArrayBufferOrArrayBufferView& aData, - const Optional& aRemoteAddress, - const Optional>& aRemotePort, - ErrorResult& aRv); - -private: - UDPSocket(nsPIDOMWindow* aOwner, - const nsCString& aRemoteAddress, - const Nullable& aRemotePort); - - virtual ~UDPSocket(); - - nsresult - Init(const nsString& aLocalAddress, - const Nullable& aLocalPort, - const bool& aAddressReuse, - const bool& aLoopback); - - nsresult - InitLocal(const nsAString& aLocalAddress, const uint16_t& aLocalPort); - - nsresult - InitRemote(const nsAString& aLocalAddress, const uint16_t& aLocalPort); - - void - HandleReceivedData(const nsACString& aRemoteAddress, - const uint16_t& aRemotePort, - const uint8_t* aData, - const uint32_t& aDataLength); - - nsresult - DispatchReceivedData(const nsACString& aRemoteAddress, - const uint16_t& aRemotePort, - const uint8_t* aData, - const uint32_t& aDataLength); - - void - CloseWithReason(nsresult aReason); - - nsresult - DoPendingMcastCommand(); - - nsString mLocalAddress; - Nullable mLocalPort; - nsCString mRemoteAddress; - Nullable mRemotePort; - bool mAddressReuse; - bool mLoopback; - SocketReadyState mReadyState; - nsRefPtr mOpened; - nsRefPtr mClosed; - - nsCOMPtr mSocket; - nsCOMPtr mSocketChild; - - struct MulticastCommand { - enum CommandType { Join, Leave }; - - MulticastCommand(CommandType aCommand, const nsAString& aAddress) - : mCommand(aCommand), mAddress(aAddress) - { } - - CommandType mCommand; - nsString mAddress; - }; - - nsTArray mPendingMcastCommands; -}; - -} // namespace dom -} // namespace mozilla - -#endif // mozilla_dom_UDPSocket_h__ diff --git a/dom/network/src/UDPSocketChild.cpp b/dom/network/src/UDPSocketChild.cpp index 4b9f530e386..dcb4fa72405 100644 --- a/dom/network/src/UDPSocketChild.cpp +++ b/dom/network/src/UDPSocketChild.cpp @@ -3,8 +3,6 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "UDPSocketChild.h" -#include "mozilla/unused.h" -#include "mozilla/ipc/InputStreamUtils.h" #include "mozilla/net/NeckoChild.h" using mozilla::net::gNeckoChild; @@ -61,20 +59,17 @@ UDPSocketChild::~UDPSocketChild() // nsIUDPSocketChild Methods NS_IMETHODIMP -UDPSocketChild::Bind(nsIUDPSocketInternal* aSocket, +UDPSocketChild::Bind(nsIUDPSocketInternal *aSocket, const nsACString& aHost, - uint16_t aPort, - bool aAddressReuse, - bool aLoopback) + uint16_t aPort) { NS_ENSURE_ARG(aSocket); mSocket = aSocket; AddIPDLReference(); - gNeckoChild->SendPUDPSocketConstructor(this, mFilterName); + gNeckoChild->SendPUDPSocketConstructor(this, nsCString(aHost), aPort, mFilterName); - SendBind(UDPAddressInfo(nsCString(aHost), aPort), aAddressReuse, aLoopback); return NS_OK; } @@ -88,47 +83,11 @@ UDPSocketChild::Close() NS_IMETHODIMP UDPSocketChild::Send(const nsACString& aHost, uint16_t aPort, - const uint8_t* aData, + const uint8_t *aData, uint32_t aByteLength) { NS_ENSURE_ARG(aData); - return SendDataInternal(UDPSocketAddr(UDPAddressInfo(nsCString(aHost), aPort)), - aData, aByteLength); -} - -NS_IMETHODIMP -UDPSocketChild::SendWithAddr(nsINetAddr* aAddr, - const uint8_t* aData, - uint32_t aByteLength) -{ - NS_ENSURE_ARG(aAddr); - NS_ENSURE_ARG(aData); - - NetAddr addr; - aAddr->GetNetAddr(&addr); - - return SendDataInternal(UDPSocketAddr(addr), aData, aByteLength); -} - -NS_IMETHODIMP -UDPSocketChild::SendWithAddress(const NetAddr* aAddr, - const uint8_t* aData, - uint32_t aByteLength) -{ - NS_ENSURE_ARG(aAddr); - NS_ENSURE_ARG(aData); - - return SendDataInternal(UDPSocketAddr(*aAddr), aData, aByteLength); -} - -nsresult -UDPSocketChild::SendDataInternal(const UDPSocketAddr& aAddr, - const uint8_t* aData, - const uint32_t aByteLength) -{ - NS_ENSURE_ARG(aData); - FallibleTArray fallibleArray; if (!fallibleArray.InsertElementsAt(0, aData, aByteLength)) { return NS_ERROR_OUT_OF_MEMORY; @@ -136,48 +95,47 @@ UDPSocketChild::SendDataInternal(const UDPSocketAddr& aAddr, InfallibleTArray array; array.SwapElements(fallibleArray); - - SendOutgoingData(array, aAddr); + SendData(array, nsCString(aHost), aPort); return NS_OK; } NS_IMETHODIMP -UDPSocketChild::SendBinaryStream(const nsACString& aHost, - uint16_t aPort, - nsIInputStream* aStream) +UDPSocketChild::SendWithAddr(nsINetAddr *aAddr, + const uint8_t *aData, + uint32_t aByteLength) { - NS_ENSURE_ARG(aStream); + NS_ENSURE_ARG(aAddr); + NS_ENSURE_ARG(aData); - OptionalInputStreamParams stream; - nsTArray fds; - SerializeInputStream(aStream, stream, fds); + NetAddr addr; + aAddr->GetNetAddr(&addr); - MOZ_ASSERT(fds.IsEmpty()); - - SendOutgoingData(UDPData(stream), UDPSocketAddr(UDPAddressInfo(nsCString(aHost), aPort))); - - return NS_OK; + return SendWithAddress(&addr, aData, aByteLength); } NS_IMETHODIMP -UDPSocketChild::JoinMulticast(const nsACString& aMulticastAddress, - const nsACString& aInterface) +UDPSocketChild::SendWithAddress(const NetAddr *aAddr, + const uint8_t *aData, + uint32_t aByteLength) { - SendJoinMulticast(nsCString(aMulticastAddress), nsCString(aInterface)); + NS_ENSURE_ARG(aAddr); + NS_ENSURE_ARG(aData); + + FallibleTArray fallibleArray; + if (!fallibleArray.InsertElementsAt(0, aData, aByteLength)) { + return NS_ERROR_OUT_OF_MEMORY; + } + + InfallibleTArray array; + array.SwapElements(fallibleArray); + SendDataWithAddress(array, *aAddr); + return NS_OK; } NS_IMETHODIMP -UDPSocketChild::LeaveMulticast(const nsACString& aMulticastAddress, - const nsACString& aInterface) -{ - SendLeaveMulticast(nsCString(aMulticastAddress), nsCString(aInterface)); - return NS_OK; -} - -NS_IMETHODIMP -UDPSocketChild::GetLocalPort(uint16_t* aLocalPort) +UDPSocketChild::GetLocalPort(uint16_t *aLocalPort) { NS_ENSURE_ARG_POINTER(aLocalPort); @@ -186,14 +144,14 @@ UDPSocketChild::GetLocalPort(uint16_t* aLocalPort) } NS_IMETHODIMP -UDPSocketChild::GetLocalAddress(nsACString& aLocalAddress) +UDPSocketChild::GetLocalAddress(nsACString &aLocalAddress) { aLocalAddress = mLocalAddress; return NS_OK; } NS_IMETHODIMP -UDPSocketChild::SetFilterName(const nsACString& aFilterName) +UDPSocketChild::SetFilterName(const nsACString &aFilterName) { if (!mFilterName.IsEmpty()) { // filter name can only be set once. @@ -204,7 +162,7 @@ UDPSocketChild::SetFilterName(const nsACString& aFilterName) } NS_IMETHODIMP -UDPSocketChild::GetFilterName(nsACString& aFilterName) +UDPSocketChild::GetFilterName(nsACString &aFilterName) { aFilterName = mFilterName; return NS_OK; @@ -212,44 +170,39 @@ UDPSocketChild::GetFilterName(nsACString& aFilterName) // PUDPSocketChild Methods bool -UDPSocketChild::RecvCallbackOpened(const UDPAddressInfo& aAddressInfo) +UDPSocketChild::RecvCallback(const nsCString &aType, + const UDPCallbackData &aData, + const nsCString &aState) { - mLocalAddress = aAddressInfo.addr(); - mLocalPort = aAddressInfo.port(); + if (NS_FAILED(mSocket->UpdateReadyState(aState))) + NS_ERROR("Shouldn't fail!"); - nsresult rv = mSocket->CallListenerOpened(); - mozilla::unused << NS_WARN_IF(NS_FAILED(rv)); + nsresult rv = NS_ERROR_FAILURE; + if (aData.type() == UDPCallbackData::Tvoid_t) { + rv = mSocket->CallListenerVoid(aType); + } else if (aData.type() == UDPCallbackData::TUDPError) { + const UDPError& err(aData.get_UDPError()); + rv = mSocket->CallListenerError(aType, err.message(), err.filename(), + err.lineNumber(), err.columnNumber()); + } else if (aData.type() == UDPCallbackData::TUDPMessage) { + const UDPMessage& message(aData.get_UDPMessage()); + InfallibleTArray data(message.data()); + rv = mSocket->CallListenerReceivedData(aType, message.fromAddr(), message.port(), + data.Elements(), data.Length()); + } else if (aData.type() == UDPCallbackData::TUDPAddressInfo) { + //update local address and port. + const UDPAddressInfo& addressInfo(aData.get_UDPAddressInfo()); + mLocalAddress = addressInfo.local(); + mLocalPort = addressInfo.port(); + rv = mSocket->CallListenerVoid(aType); + } else if (aData.type() == UDPCallbackData::TUDPSendResult) { + const UDPSendResult& returnValue(aData.get_UDPSendResult()); + rv = mSocket->CallListenerSent(aType, returnValue.value()); + } else { + MOZ_ASSERT(false, "Invalid callback type!"); + } - return true; -} - -bool -UDPSocketChild::RecvCallbackClosed() -{ - nsresult rv = mSocket->CallListenerClosed(); - mozilla::unused << NS_WARN_IF(NS_FAILED(rv)); - - return true; -} - -bool -UDPSocketChild::RecvCallbackReceivedData(const UDPAddressInfo& aAddressInfo, - const InfallibleTArray& aData) -{ - nsresult rv = mSocket->CallListenerReceivedData(aAddressInfo.addr(), aAddressInfo.port(), - aData.Elements(), aData.Length()); - mozilla::unused << NS_WARN_IF(NS_FAILED(rv)); - - return true; -} - -bool -UDPSocketChild::RecvCallbackError(const nsCString& aMessage, - const nsCString& aFilename, - const uint32_t& aLineNumber) -{ - nsresult rv = mSocket->CallListenerError(aMessage, aFilename, aLineNumber); - mozilla::unused << NS_WARN_IF(NS_FAILED(rv)); + NS_ENSURE_SUCCESS(rv, true); return true; } diff --git a/dom/network/src/UDPSocketChild.h b/dom/network/src/UDPSocketChild.h index d154e304f7e..069b821f34a 100644 --- a/dom/network/src/UDPSocketChild.h +++ b/dom/network/src/UDPSocketChild.h @@ -40,19 +40,10 @@ public: UDPSocketChild(); virtual ~UDPSocketChild(); - virtual bool RecvCallbackOpened(const UDPAddressInfo& aAddressInfo) MOZ_OVERRIDE; - virtual bool RecvCallbackClosed() MOZ_OVERRIDE; - virtual bool RecvCallbackReceivedData(const UDPAddressInfo& aAddressInfo, - const InfallibleTArray& aData) MOZ_OVERRIDE; - virtual bool RecvCallbackError(const nsCString& aMessage, - const nsCString& aFilename, - const uint32_t& aLineNumber) MOZ_OVERRIDE; - + virtual bool RecvCallback(const nsCString& aType, + const UDPCallbackData& aData, + const nsCString& aState) MOZ_OVERRIDE; private: - nsresult SendDataInternal(const UDPSocketAddr& aAddr, - const uint8_t* aData, - const uint32_t aByteLength); - uint16_t mLocalPort; nsCString mLocalAddress; nsCString mFilterName; diff --git a/dom/network/src/UDPSocketParent.cpp b/dom/network/src/UDPSocketParent.cpp index a39cde9cefd..ad89f9b91c4 100644 --- a/dom/network/src/UDPSocketParent.cpp +++ b/dom/network/src/UDPSocketParent.cpp @@ -9,11 +9,8 @@ #include "nsComponentManagerUtils.h" #include "nsIUDPSocket.h" #include "nsINetAddr.h" -#include "mozilla/AppProcessChecker.h" #include "mozilla/unused.h" -#include "mozilla/ipc/InputStreamUtils.h" #include "mozilla/net/DNS.h" -#include "mozilla/net/NeckoCommon.h" #include "nsNetUtil.h" #include "mozilla/dom/ContentParent.h" #include "mozilla/dom/TabParent.h" @@ -22,10 +19,52 @@ namespace mozilla { namespace dom { +static void +FireInternalError(mozilla::net::PUDPSocketParent *aActor, uint32_t aLineNo) +{ + mozilla::unused << + aActor->SendCallback(NS_LITERAL_CSTRING("onerror"), + UDPError(NS_LITERAL_CSTRING("Internal error"), + NS_LITERAL_CSTRING(__FILE__), aLineNo, 0), + NS_LITERAL_CSTRING("connecting")); +} + +static nsresult +ConvertNetAddrToString(mozilla::net::NetAddr &netAddr, nsACString *address, uint16_t *port) +{ + NS_ENSURE_ARG_POINTER(address); + NS_ENSURE_ARG_POINTER(port); + + *port = 0; + uint32_t bufSize = 0; + + switch(netAddr.raw.family) { + case AF_INET: + *port = PR_ntohs(netAddr.inet.port); + bufSize = mozilla::net::kIPv4CStrBufSize; + break; + case AF_INET6: + *port = PR_ntohs(netAddr.inet6.port); + bufSize = mozilla::net::kIPv6CStrBufSize; + break; + default: + //impossible + MOZ_ASSERT(false, "Unexpected address family"); + return NS_ERROR_INVALID_ARG; + } + + address->SetCapacity(bufSize); + NetAddrToString(&netAddr, address->BeginWriting(), bufSize); + address->SetLength(strlen(address->BeginReading())); + + return NS_OK; +} + NS_IMPL_ISUPPORTS(UDPSocketParent, nsIUDPSocketListener) -UDPSocketParent::UDPSocketParent() +UDPSocketParent::UDPSocketParent(nsIUDPSocketFilter *filter) : mIPCOpen(true) + , mFilter(filter) { mObserver = new mozilla::net::OfflineObserver(this); } @@ -37,30 +76,6 @@ UDPSocketParent::~UDPSocketParent() } } -bool -UDPSocketParent::Init(const nsACString& aFilter) -{ - if (!aFilter.IsEmpty()) { - nsAutoCString contractId(NS_NETWORK_UDP_SOCKET_FILTER_HANDLER_PREFIX); - contractId.Append(aFilter); - nsCOMPtr filterHandler = - do_GetService(contractId.get()); - if (filterHandler) { - nsresult rv = filterHandler->NewFilter(getter_AddRefs(mFilter)); - if (NS_FAILED(rv)) { - printf_stderr("Cannot create filter that content specified. " - "filter name: %s, error code: %d.", aFilter.BeginReading(), rv); - return false; - } - } else { - printf_stderr("Content doesn't have a valid filter. " - "filter name: %s.", aFilter.BeginReading()); - return false; - } - } - return true; -} - uint32_t UDPSocketParent::GetAppId() { @@ -104,236 +119,125 @@ UDPSocketParent::OfflineNotification(nsISupports *aSubject) // PUDPSocketParent methods bool -UDPSocketParent::RecvBind(const UDPAddressInfo& aAddressInfo, - const bool& aAddressReuse, const bool& aLoopback) -{ - // We don't have browser actors in xpcshell, and hence can't run automated - // tests without this loophole. - if (net::UsingNeckoIPCSecurity() && !mFilter && - !AssertAppProcessPermission(Manager()->Manager(), "udp-socket")) { - FireInternalError(__LINE__); - return false; - } - - if (NS_FAILED(BindInternal(aAddressInfo.addr(), aAddressInfo.port(), aAddressReuse, aLoopback))) { - FireInternalError(__LINE__); - return true; - } - - nsCOMPtr localAddr; - mSocket->GetLocalAddr(getter_AddRefs(localAddr)); - - nsCString addr; - if (NS_FAILED(localAddr->GetAddress(addr))) { - FireInternalError(__LINE__); - return true; - } - - uint16_t port; - if (NS_FAILED(localAddr->GetPort(&port))) { - FireInternalError(__LINE__); - return true; - } - - mozilla::unused << SendCallbackOpened(UDPAddressInfo(addr, port)); - - return true; -} - -nsresult -UDPSocketParent::BindInternal(const nsCString& aHost, const uint16_t& aPort, - const bool& aAddressReuse, const bool& aLoopback) +UDPSocketParent::Init(const nsCString &aHost, const uint16_t aPort) { nsresult rv; + NS_ASSERTION(mFilter, "No packet filter"); nsCOMPtr sock = do_CreateInstance("@mozilla.org/network/udp-socket;1", &rv); - - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; + if (NS_FAILED(rv)) { + FireInternalError(this, __LINE__); + return true; } if (aHost.IsEmpty()) { - rv = sock->Init(aPort, false, aAddressReuse, /* optional_argc = */ 1); + rv = sock->Init(aPort, false); } else { PRNetAddr prAddr; PR_InitializeNetAddr(PR_IpAddrAny, aPort, &prAddr); PRStatus status = PR_StringToNetAddr(aHost.BeginReading(), &prAddr); if (status != PR_SUCCESS) { - return NS_ERROR_FAILURE; + FireInternalError(this, __LINE__); + return true; } mozilla::net::NetAddr addr; PRNetAddrToNetAddr(&prAddr, &addr); - rv = sock->InitWithAddress(&addr, aAddressReuse, /* optional_argc = */ 1); + rv = sock->InitWithAddress(&addr); } - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - rv = sock->SetMulticastLoopback(aLoopback); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - // register listener - rv = sock->AsyncListen(this); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; + if (NS_FAILED(rv)) { + FireInternalError(this, __LINE__); + return true; } mSocket = sock; - return NS_OK; -} + net::NetAddr localAddr; + mSocket->GetAddress(&localAddr); -bool -UDPSocketParent::RecvOutgoingData(const UDPData& aData, - const UDPSocketAddr& aAddr) -{ - MOZ_ASSERT(mSocket); - - nsresult rv; - if (mFilter) { - // TODO, Bug 933102, filter packets that are sent with hostname. - // Until then we simply throw away packets that are sent to a hostname. - if (aAddr.type() != UDPSocketAddr::TNetAddr) { - return true; - } - - // TODO, Packet filter doesn't support input stream yet. - if (aData.type() != UDPData::TArrayOfuint8_t) { - return true; - } - - bool allowed; - const InfallibleTArray& data(aData.get_ArrayOfuint8_t()); - rv = mFilter->FilterPacket(&aAddr.get_NetAddr(), data.Elements(), - data.Length(), nsIUDPSocketFilter::SF_OUTGOING, - &allowed); - - // Sending unallowed data, kill content. - if (NS_WARN_IF(NS_FAILED(rv)) || !allowed) { - return false; - } - } - - switch(aData.type()) { - case UDPData::TArrayOfuint8_t: - Send(aData.get_ArrayOfuint8_t(), aAddr); - break; - case UDPData::TInputStreamParams: - Send(aData.get_InputStreamParams(), aAddr); - break; - default: - MOZ_ASSERT(false, "Invalid data type!"); - return true; - } - - return true; -} - -void -UDPSocketParent::Send(const InfallibleTArray& aData, - const UDPSocketAddr& aAddr) -{ - nsresult rv; - uint32_t count; - switch(aAddr.type()) { - case UDPSocketAddr::TUDPAddressInfo: { - const UDPAddressInfo& addrInfo(aAddr.get_UDPAddressInfo()); - rv = mSocket->Send(addrInfo.addr(), addrInfo.port(), - aData.Elements(), aData.Length(), &count); - break; - } - case UDPSocketAddr::TNetAddr: { - const NetAddr& addr(aAddr.get_NetAddr()); - rv = mSocket->SendWithAddress(&addr, aData.Elements(), - aData.Length(), &count); - break; - } - default: - MOZ_ASSERT(false, "Invalid address type!"); - return; - } - - if (NS_WARN_IF(NS_FAILED(rv)) || count == 0) { - FireInternalError(__LINE__); - } -} - -void -UDPSocketParent::Send(const InputStreamParams& aStream, - const UDPSocketAddr& aAddr) -{ - nsTArray fds; - nsCOMPtr stream = DeserializeInputStream(aStream, fds); - - if (NS_WARN_IF(!stream)) { - return; - } - - nsresult rv; - switch(aAddr.type()) { - case UDPSocketAddr::TUDPAddressInfo: { - const UDPAddressInfo& addrInfo(aAddr.get_UDPAddressInfo()); - rv = mSocket->SendBinaryStream(addrInfo.addr(), addrInfo.port(), stream); - break; - } - case UDPSocketAddr::TNetAddr: { - const NetAddr& addr(aAddr.get_NetAddr()); - rv = mSocket->SendBinaryStreamWithAddress(&addr, stream); - break; - } - default: - MOZ_ASSERT(false, "Invalid address type!"); - return; - } + uint16_t port; + nsCString addr; + rv = ConvertNetAddrToString(localAddr, &addr, &port); if (NS_FAILED(rv)) { - FireInternalError(__LINE__); + FireInternalError(this, __LINE__); + return true; } -} -bool -UDPSocketParent::RecvJoinMulticast(const nsCString& aMulticastAddress, - const nsCString& aInterface) -{ - nsresult rv = mSocket->JoinMulticast(aMulticastAddress, aInterface); - - if (NS_WARN_IF(NS_FAILED(rv))) { - FireInternalError(__LINE__); - } + // register listener + mSocket->AsyncListen(this); + mozilla::unused << + PUDPSocketParent::SendCallback(NS_LITERAL_CSTRING("onopen"), + UDPAddressInfo(addr, port), + NS_LITERAL_CSTRING("connected")); return true; } bool -UDPSocketParent::RecvLeaveMulticast(const nsCString& aMulticastAddress, - const nsCString& aInterface) +UDPSocketParent::RecvData(const InfallibleTArray &aData, + const nsCString& aRemoteAddress, + const uint16_t& aPort) { - nsresult rv = mSocket->LeaveMulticast(aMulticastAddress, aInterface); + NS_ENSURE_TRUE(mSocket, true); + NS_ASSERTION(mFilter, "No packet filter"); + // TODO, Bug 933102, filter packets that are sent with hostname. + // Until then we simply throw away packets that are sent to a hostname. + return true; - if (NS_WARN_IF(NS_FAILED(rv))) { - FireInternalError(__LINE__); - } +#if 0 + // Enable this once we have filtering working with hostname delivery. + uint32_t count; + nsresult rv = mSocket->Send(aRemoteAddress, + aPort, aData.Elements(), + aData.Length(), &count); + mozilla::unused << + PUDPSocketParent::SendCallback(NS_LITERAL_CSTRING("onsent"), + UDPSendResult(rv), + NS_LITERAL_CSTRING("connected")); + NS_ENSURE_SUCCESS(rv, true); + NS_ENSURE_TRUE(count > 0, true); + return true; +#endif +} +bool +UDPSocketParent::RecvDataWithAddress(const InfallibleTArray& aData, + const mozilla::net::NetAddr& aAddr) +{ + NS_ENSURE_TRUE(mSocket, true); + NS_ASSERTION(mFilter, "No packet filter"); + + uint32_t count; + nsresult rv; + bool allowed; + rv = mFilter->FilterPacket(&aAddr, aData.Elements(), + aData.Length(), nsIUDPSocketFilter::SF_OUTGOING, + &allowed); + // Sending unallowed data, kill content. + NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_TRUE(allowed, false); + + rv = mSocket->SendWithAddress(&aAddr, aData.Elements(), + aData.Length(), &count); + mozilla::unused << + PUDPSocketParent::SendCallback(NS_LITERAL_CSTRING("onsent"), + UDPSendResult(rv), + NS_LITERAL_CSTRING("connected")); + NS_ENSURE_SUCCESS(rv, true); + NS_ENSURE_TRUE(count > 0, true); return true; } bool UDPSocketParent::RecvClose() { - if (!mSocket) { - return true; - } - + NS_ENSURE_TRUE(mSocket, true); nsresult rv = mSocket->Close(); mSocket = nullptr; - - mozilla::unused << NS_WARN_IF(NS_FAILED(rv)); - + NS_ENSURE_SUCCESS(rv, true); return true; } @@ -364,6 +268,7 @@ UDPSocketParent::OnPacketReceived(nsIUDPSocket* aSocket, nsIUDPMessage* aMessage if (!mIPCOpen) { return NS_OK; } + NS_ASSERTION(mFilter, "No packet filter"); uint16_t port; nsCString ip; @@ -378,30 +283,30 @@ UDPSocketParent::OnPacketReceived(nsIUDPSocket* aSocket, nsIUDPMessage* aMessage const char* buffer = data.get(); uint32_t len = data.Length(); - if (mFilter) { - bool allowed; - mozilla::net::NetAddr addr; - fromAddr->GetNetAddr(&addr); - nsresult rv = mFilter->FilterPacket(&addr, - (const uint8_t*)buffer, len, - nsIUDPSocketFilter::SF_INCOMING, - &allowed); - // Receiving unallowed data, drop. - if (NS_WARN_IF(NS_FAILED(rv)) || !allowed) { - return NS_OK; - } - } + bool allowed; + mozilla::net::NetAddr addr; + fromAddr->GetNetAddr(&addr); + nsresult rv = mFilter->FilterPacket(&addr, + (const uint8_t*)buffer, len, + nsIUDPSocketFilter::SF_INCOMING, + &allowed); + // Receiving unallowed data, drop. + NS_ENSURE_SUCCESS(rv, NS_OK); + NS_ENSURE_TRUE(allowed, NS_OK); FallibleTArray fallibleArray; if (!fallibleArray.InsertElementsAt(0, buffer, len)) { - FireInternalError(__LINE__); + FireInternalError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } InfallibleTArray infallibleArray; infallibleArray.SwapElements(fallibleArray); // compose callback - mozilla::unused << SendCallbackReceivedData(UDPAddressInfo(ip, port), infallibleArray); + mozilla::unused << + PUDPSocketParent::SendCallback(NS_LITERAL_CSTRING("ondata"), + UDPMessage(ip, port, infallibleArray), + NS_LITERAL_CSTRING("connected")); return NS_OK; } @@ -411,21 +316,13 @@ UDPSocketParent::OnStopListening(nsIUDPSocket* aSocket, nsresult aStatus) { // underlying socket is dead, send state update to child process if (mIPCOpen) { - mozilla::unused << SendCallbackClosed(); + mozilla::unused << + PUDPSocketParent::SendCallback(NS_LITERAL_CSTRING("onclose"), + mozilla::void_t(), + NS_LITERAL_CSTRING("closed")); } return NS_OK; } -void -UDPSocketParent::FireInternalError(uint32_t aLineNo) -{ - if (!mIPCOpen) { - return; - } - - mozilla::unused << SendCallbackError(NS_LITERAL_CSTRING("Internal error"), - NS_LITERAL_CSTRING(__FILE__), aLineNo); -} - } // namespace dom } // namespace mozilla diff --git a/dom/network/src/UDPSocketParent.h b/dom/network/src/UDPSocketParent.h index 1f9cd392196..ea81c9ed210 100644 --- a/dom/network/src/UDPSocketParent.h +++ b/dom/network/src/UDPSocketParent.h @@ -24,22 +24,17 @@ public: NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIUDPSOCKETLISTENER - explicit UDPSocketParent(); + explicit UDPSocketParent(nsIUDPSocketFilter* filter); - bool Init(const nsACString& aFilter); - - virtual bool RecvBind(const UDPAddressInfo& aAddressInfo, - const bool& aAddressReuse, const bool& aLoopback) MOZ_OVERRIDE; - - virtual bool RecvOutgoingData(const UDPData& aData, const UDPSocketAddr& aAddr) MOZ_OVERRIDE; + bool Init(const nsCString& aHost, const uint16_t aPort); virtual bool RecvClose() MOZ_OVERRIDE; - + virtual bool RecvData(const InfallibleTArray& aData, + const nsCString& aRemoteAddress, + const uint16_t& aPort) MOZ_OVERRIDE; + virtual bool RecvDataWithAddress( const InfallibleTArray& data, + const mozilla::net::NetAddr& addr); virtual bool RecvRequestDelete() MOZ_OVERRIDE; - virtual bool RecvJoinMulticast(const nsCString& aMulticastAddress, - const nsCString& aInterface) MOZ_OVERRIDE; - virtual bool RecvLeaveMulticast(const nsCString& aMulticastAddress, - const nsCString& aInterface) MOZ_OVERRIDE; virtual nsresult OfflineNotification(nsISupports *) MOZ_OVERRIDE; virtual uint32_t GetAppId() MOZ_OVERRIDE; @@ -47,12 +42,6 @@ private: virtual ~UDPSocketParent(); virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE; - void Send(const InfallibleTArray& aData, const UDPSocketAddr& aAddr); - void Send(const InputStreamParams& aStream, const UDPSocketAddr& aAddr); - nsresult BindInternal(const nsCString& aHost, const uint16_t& aPort, - const bool& aAddressReuse, const bool& aLoopback); - - void FireInternalError(uint32_t aLineNo); bool mIPCOpen; nsCOMPtr mSocket; diff --git a/dom/network/src/moz.build b/dom/network/src/moz.build index a4783944b51..01d22441157 100644 --- a/dom/network/src/moz.build +++ b/dom/network/src/moz.build @@ -4,10 +4,6 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -EXPORTS.mozilla.dom += [ - 'UDPSocket.h', -] - EXPORTS.mozilla.dom.network += [ 'Connection.h', 'Constants.h', @@ -26,7 +22,6 @@ UNIFIED_SOURCES += [ 'TCPServerSocketParent.cpp', 'TCPSocketChild.cpp', 'TCPSocketParent.cpp', - 'UDPSocket.cpp', 'UDPSocketChild.cpp', 'UDPSocketParent.cpp', ] diff --git a/dom/network/tests/file_udpsocket_iframe.html b/dom/network/tests/file_udpsocket_iframe.html deleted file mode 100644 index 1e124552dda..00000000000 --- a/dom/network/tests/file_udpsocket_iframe.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - Test UDPSocket BFCache - - - - - diff --git a/dom/network/tests/mochitest.ini b/dom/network/tests/mochitest.ini index eb93a635143..376acd80559 100644 --- a/dom/network/tests/mochitest.ini +++ b/dom/network/tests/mochitest.ini @@ -1,7 +1,3 @@ -[DEFAULT] -support-files = - file_udpsocket_iframe.html - [test_network_basics.html] skip-if = toolkit == "gonk" || toolkit == 'android' [test_tcpsocket_default_permissions.html] @@ -20,4 +16,3 @@ skip-if = toolkit != "gonk" skip-if = toolkit != "gonk" [test_networkstats_enabled_perm.html] skip-if = toolkit != "gonk" -[test_udpsocket.html] diff --git a/dom/network/tests/test_udpsocket.html b/dom/network/tests/test_udpsocket.html deleted file mode 100644 index c1b4e5b2498..00000000000 --- a/dom/network/tests/test_udpsocket.html +++ /dev/null @@ -1,409 +0,0 @@ - - - - Test UDPSocket API - - - - -

- - -
-
-
- - diff --git a/dom/permission/tests/mochitest.ini b/dom/permission/tests/mochitest.ini index 49ec30e50b5..962d3db1774 100644 --- a/dom/permission/tests/mochitest.ini +++ b/dom/permission/tests/mochitest.ini @@ -16,7 +16,6 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' # b2g(https not working, bug [test_power.html] [test_systemXHR.html] [test_tcp-socket.html] -[test_udp-socket.html] [test_webapps-manage.html] [test_camera.html] disabled = disabled until bug 859593 is fixed diff --git a/dom/permission/tests/test_udp-socket.html b/dom/permission/tests/test_udp-socket.html deleted file mode 100644 index 566e7a8763d..00000000000 --- a/dom/permission/tests/test_udp-socket.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Test for Bug 745283 - - - - -Mozilla Bug 745283 -

- -
-
-
-
- - - diff --git a/dom/tests/mochitest/general/test_interfaces.html b/dom/tests/mochitest/general/test_interfaces.html index 61f83350e8d..9fa87b9dd20 100644 --- a/dom/tests/mochitest/general/test_interfaces.html +++ b/dom/tests/mochitest/general/test_interfaces.html @@ -1168,10 +1168,6 @@ var interfaceNamesInGlobalScope = {name: "TreeSelection", xbl: true}, // IMPORTANT: Do not change this list without review from a DOM peer! "TreeWalker", -// IMPORTANT: Do not change this list without review from a DOM peer! - {name: "UDPMessageEvent", pref: "dom.udpsocket.enabled", permission: "udp-socket"}, -// IMPORTANT: Do not change this list without review from a DOM peer! - {name: "UDPSocket", pref: "dom.udpsocket.enabled", permission: "udp-socket"}, // IMPORTANT: Do not change this list without review from a DOM peer! "UIEvent", // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/dom/webidl/SocketCommon.webidl b/dom/webidl/SocketCommon.webidl deleted file mode 100644 index 044199ea2bd..00000000000 --- a/dom/webidl/SocketCommon.webidl +++ /dev/null @@ -1,16 +0,0 @@ -/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. - * - * The origin of this IDL file is - * http://www.w3.org/2012/sysapps/tcp-udp-sockets/#readystate - */ - -enum SocketReadyState { - "opening", - "open", - "closing", - "closed", - "halfclosed" -}; diff --git a/dom/webidl/UDPMessageEvent.webidl b/dom/webidl/UDPMessageEvent.webidl deleted file mode 100644 index 4cbf0300e75..00000000000 --- a/dom/webidl/UDPMessageEvent.webidl +++ /dev/null @@ -1,24 +0,0 @@ -/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. - * - * The origin of this IDL file is - * http://www.w3.org/TR/raw-sockets/#interface-udpmessageevent - */ - -//Bug 1056444: This interface should be removed after UDPSocket.input/UDPSocket.output are ready. -[Constructor(DOMString type, optional UDPMessageEventInit eventInitDict), - Pref="dom.udpsocket.enabled", - CheckPermissions="udp-socket"] -interface UDPMessageEvent : Event { - readonly attribute DOMString remoteAddress; - readonly attribute unsigned short remotePort; - readonly attribute any data; -}; - -dictionary UDPMessageEventInit : EventInit { - DOMString remoteAddress = ""; - unsigned short remotePort = 0; - any data = null; -}; diff --git a/dom/webidl/UDPSocket.webidl b/dom/webidl/UDPSocket.webidl deleted file mode 100644 index 51ac7c84b7a..00000000000 --- a/dom/webidl/UDPSocket.webidl +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. - * - * The origin of this IDL file is - * http://www.w3.org/2012/sysapps/tcp-udp-sockets/#interface-udpsocket - * http://www.w3.org/2012/sysapps/tcp-udp-sockets/#dictionary-udpoptions - */ - -dictionary UDPOptions { - DOMString localAddress; - unsigned short localPort; - DOMString remoteAddress; - unsigned short remotePort; - boolean addressReuse = true; - boolean loopback = false; -}; - -[Constructor (optional UDPOptions options), - Pref="dom.udpsocket.enabled", - CheckPermissions="udp-socket"] -interface UDPSocket : EventTarget { - readonly attribute DOMString? localAddress; - readonly attribute unsigned short? localPort; - readonly attribute DOMString? remoteAddress; - readonly attribute unsigned short? remotePort; - readonly attribute boolean addressReuse; - readonly attribute boolean loopback; - readonly attribute SocketReadyState readyState; - readonly attribute Promise opened; - readonly attribute Promise closed; -// readonly attribute ReadableStream input; //Bug 1056444: Stream API is not ready -// readonly attribute WriteableStream output; //Bug 1056444: Stream API is not ready - attribute EventHandler onmessage; //Bug 1056444: use event interface before Stream API is ready - Promise close (); - [Throws] void joinMulticastGroup (DOMString multicastGroupAddress); - [Throws] void leaveMulticastGroup (DOMString multicastGroupAddress); - [Throws] boolean send ((DOMString or Blob or ArrayBuffer or ArrayBufferView) data, optional DOMString? remoteAddress, optional unsigned short? remotePort); //Bug 1056444: use send method before Stream API is ready -}; diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build index ff9834cb9aa..2d5c88b1d03 100644 --- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -333,7 +333,6 @@ WEBIDL_FILES = [ 'SharedWorker.webidl', 'SharedWorkerGlobalScope.webidl', 'SimpleGestureEvent.webidl', - 'SocketCommon.webidl', 'SourceBuffer.webidl', 'SourceBufferList.webidl', 'Storage.webidl', @@ -469,8 +468,6 @@ WEBIDL_FILES = [ 'TransitionEvent.webidl', 'TreeColumns.webidl', 'TreeWalker.webidl', - 'UDPMessageEvent.webidl', - 'UDPSocket.webidl', 'UIEvent.webidl', 'UndoManager.webidl', 'URL.webidl', @@ -679,7 +676,6 @@ GENERATED_EVENTS_WEBIDL_FILES = [ 'StyleSheetApplicableStateChangeEvent.webidl', 'StyleSheetChangeEvent.webidl', 'TrackEvent.webidl', - 'UDPMessageEvent.webidl', 'UserProximityEvent.webidl', 'USSDReceivedEvent.webidl', ] diff --git a/media/mtransport/nr_socket_prsock.cpp b/media/mtransport/nr_socket_prsock.cpp index e9e8b3d1bf0..351529c42a9 100644 --- a/media/mtransport/nr_socket_prsock.cpp +++ b/media/mtransport/nr_socket_prsock.cpp @@ -705,13 +705,17 @@ NrSocketIpc::NrSocketIpc(const nsCOMPtr &main_thread) // IUDPSocketInternal interfaces // callback while error happened in UDP socket operation -NS_IMETHODIMP NrSocketIpc::CallListenerError(const nsACString &message, +NS_IMETHODIMP NrSocketIpc::CallListenerError(const nsACString &type, + const nsACString &message, const nsACString &filename, - uint32_t line_number) { + uint32_t line_number, + uint32_t column_number) { ASSERT_ON_THREAD(main_thread_); + MOZ_ASSERT(type.EqualsLiteral("onerror")); - r_log(LOG_GENERIC, LOG_ERR, "UDP socket error:%s at %s:%d", - message.BeginReading(), filename.BeginReading(), line_number ); + r_log(LOG_GENERIC, LOG_ERR, "UDP socket error:%s at %s:%d:%d", + message.BeginReading(), filename.BeginReading(), + line_number, column_number); ReentrantMonitorAutoEnter mon(monitor_); err_ = true; @@ -721,11 +725,12 @@ NS_IMETHODIMP NrSocketIpc::CallListenerError(const nsACString &message, } // callback while receiving UDP packet -NS_IMETHODIMP NrSocketIpc::CallListenerReceivedData(const nsACString &host, - uint16_t port, - const uint8_t *data, +NS_IMETHODIMP NrSocketIpc::CallListenerReceivedData(const nsACString &type, + const nsACString &host, + uint16_t port, uint8_t *data, uint32_t data_length) { ASSERT_ON_THREAD(main_thread_); + MOZ_ASSERT(type.EqualsLiteral("ondata")); PRNetAddr addr; memset(&addr, 0, sizeof(addr)); @@ -758,68 +763,89 @@ NS_IMETHODIMP NrSocketIpc::CallListenerReceivedData(const nsACString &host, return NS_OK; } -// callback while UDP socket is opened -NS_IMETHODIMP NrSocketIpc::CallListenerOpened() { +// callback while UDP socket is opened or closed +NS_IMETHODIMP NrSocketIpc::CallListenerVoid(const nsACString &type) { ASSERT_ON_THREAD(main_thread_); - ReentrantMonitorAutoEnter mon(monitor_); + if (type.EqualsLiteral("onopen")) { + ReentrantMonitorAutoEnter mon(monitor_); - uint16_t port; - if (NS_FAILED(socket_child_->GetLocalPort(&port))) { - err_ = true; - MOZ_ASSERT(false, "Failed to get local port"); - return NS_OK; + uint16_t port; + if (NS_FAILED(socket_child_->GetLocalPort(&port))) { + err_ = true; + MOZ_ASSERT(false, "Failed to get local port"); + return NS_OK; + } + + nsAutoCString address; + if(NS_FAILED(socket_child_->GetLocalAddress(address))) { + err_ = true; + MOZ_ASSERT(false, "Failed to get local address"); + return NS_OK; + } + + PRNetAddr praddr; + if (PR_SUCCESS != PR_InitializeNetAddr(PR_IpAddrAny, port, &praddr)) { + err_ = true; + MOZ_ASSERT(false, "Failed to set port in PRNetAddr"); + return NS_OK; + } + + if (PR_SUCCESS != PR_StringToNetAddr(address.BeginReading(), &praddr)) { + err_ = true; + MOZ_ASSERT(false, "Failed to convert local host to PRNetAddr"); + return NS_OK; + } + + nr_transport_addr expected_addr; + if(nr_transport_addr_copy(&expected_addr, &my_addr_)) { + err_ = true; + MOZ_ASSERT(false, "Failed to copy my_addr_"); + } + + if (nr_praddr_to_transport_addr(&praddr, &my_addr_, IPPROTO_UDP, 1)) { + err_ = true; + MOZ_ASSERT(false, "Failed to copy local host to my_addr_"); + } + + if (nr_transport_addr_cmp(&expected_addr, &my_addr_, + NR_TRANSPORT_ADDR_CMP_MODE_ADDR)) { + err_ = true; + MOZ_ASSERT(false, "Address of opened socket is not expected"); + } + + mon.NotifyAll(); + } else if (type.EqualsLiteral("onclose")) { + // Already handled in UpdateReadyState, nothing to do here + } else { + MOZ_ASSERT(false, "Received unexpected event"); } - nsAutoCString address; - if(NS_FAILED(socket_child_->GetLocalAddress(address))) { - err_ = true; - MOZ_ASSERT(false, "Failed to get local address"); - return NS_OK; - } - - PRNetAddr praddr; - if (PR_SUCCESS != PR_InitializeNetAddr(PR_IpAddrAny, port, &praddr)) { - err_ = true; - MOZ_ASSERT(false, "Failed to set port in PRNetAddr"); - return NS_OK; - } - - if (PR_SUCCESS != PR_StringToNetAddr(address.BeginReading(), &praddr)) { - err_ = true; - MOZ_ASSERT(false, "Failed to convert local host to PRNetAddr"); - return NS_OK; - } - - nr_transport_addr expected_addr; - if(nr_transport_addr_copy(&expected_addr, &my_addr_)) { - err_ = true; - MOZ_ASSERT(false, "Failed to copy my_addr_"); - } - - if (nr_praddr_to_transport_addr(&praddr, &my_addr_, IPPROTO_UDP, 1)) { - err_ = true; - MOZ_ASSERT(false, "Failed to copy local host to my_addr_"); - } - - if (nr_transport_addr_cmp(&expected_addr, &my_addr_, - NR_TRANSPORT_ADDR_CMP_MODE_ADDR)) { - err_ = true; - MOZ_ASSERT(false, "Address of opened socket is not expected"); - } - - mon.NotifyAll(); - return NS_OK; } -// callback while UDP socket is closed -NS_IMETHODIMP NrSocketIpc::CallListenerClosed() { +// callback while UDP packet is sent +NS_IMETHODIMP NrSocketIpc::CallListenerSent(const nsACString &type, + nsresult result) { + ASSERT_ON_THREAD(main_thread_); + MOZ_ASSERT(type.EqualsLiteral("onsent")); + + if (NS_FAILED(result)) { + ReentrantMonitorAutoEnter mon(monitor_); + err_ = true; + } + return NS_OK; +} + +// callback for state update after every socket operation +NS_IMETHODIMP NrSocketIpc::UpdateReadyState(const nsACString &readyState) { ASSERT_ON_THREAD(main_thread_); ReentrantMonitorAutoEnter mon(monitor_); - MOZ_ASSERT(state_ == NR_CONNECTED || state_ == NR_CLOSING); - state_ = NR_CLOSED; + if (readyState.EqualsLiteral("closed")) { + MOZ_ASSERT(state_ == NR_CONNECTED || state_ == NR_CLOSING); + state_ = NR_CLOSED; + } return NS_OK; } @@ -1009,20 +1035,14 @@ void NrSocketIpc::create_m(const nsACString &host, const uint16_t port) { if (NS_FAILED(rv)) { err_ = true; MOZ_ASSERT(false, "Failed to create UDPSocketChild"); - mon.NotifyAll(); - return; } socket_child_ = new nsMainThreadPtrHolder(socketChild); socket_child_->SetFilterName(nsCString("stun")); - if (NS_FAILED(socket_child_->Bind(this, host, port, - /* reuse = */ false, - /* loopback = */ false))) { + if (NS_FAILED(socket_child_->Bind(this, host, port))) { err_ = true; MOZ_ASSERT(false, "Failed to create UDP socket"); - mon.NotifyAll(); - return; } } diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 245ff6cb25f..abe43af5d8d 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -4256,6 +4256,3 @@ pref("dom.fetch.enabled", false); // platforms; and set to 0 to disable the low-memory check altogether. pref("camera.control.low_memory_thresholdMB", 404); #endif - -// UDPSocket API -pref("dom.udpsocket.enabled", false); diff --git a/netwerk/base/public/nsIUDPSocket.idl b/netwerk/base/public/nsIUDPSocket.idl index 044cf4c796a..734477a2df5 100644 --- a/netwerk/base/public/nsIUDPSocket.idl +++ b/netwerk/base/public/nsIUDPSocket.idl @@ -10,7 +10,6 @@ interface nsIUDPSocketListener; interface nsIUDPMessage; interface nsISocketTransport; interface nsIOutputStream; -interface nsIInputStream; %{ C++ #include "nsTArrayForwardDeclare.h" @@ -29,7 +28,7 @@ native NetAddr(mozilla::net::NetAddr); * * An interface to a UDP socket that can accept incoming connections. */ -[scriptable, uuid(5e526cc7-a65f-42b2-b193-a6894c0253f7)] +[scriptable, uuid(3240F793-80FA-4088-987A-9C7378F0AC88)] interface nsIUDPSocket : nsISupports { /** @@ -45,11 +44,8 @@ interface nsIUDPSocket : nsISupports * local loopback interface. Otherwise, it will accept connections * from any interface. To specify a particular network interface, * use initWithAddress. - * @param aAddressReuse - * If true, the socket is allowed to be bound to an address that is - * already in use. Default is true. */ - [optional_argc] void init(in long aPort, in boolean aLoopbackOnly, [optional] in boolean aAddressReuse); + void init(in long aPort, in boolean aLoopbackOnly); /** * initWithAddress @@ -59,11 +55,8 @@ interface nsIUDPSocket : nsISupports * * @param aAddr * The address to which this UDP socket should be bound. - * @param aAddressReuse - * If true, the socket is allowed to be bound to an address that is - * already in use. Default is true. */ - [noscript, optional_argc] void initWithAddress([const] in NetAddrPtr aAddr, [optional] in boolean aAddressReuse); + [noscript] void initWithAddress([const] in NetAddrPtr aAddr); /** * close @@ -92,11 +85,6 @@ interface nsIUDPSocket : nsISupports */ void asyncListen(in nsIUDPSocketListener aListener); - /** - * Returns the local address of this UDP socket - */ - readonly attribute nsINetAddr localAddr; - /** * Returns the port of this UDP socket. */ @@ -157,29 +145,6 @@ interface nsIUDPSocket : nsISupports [const, array, size_is(dataLength)]in uint8_t data, in unsigned long dataLength); - /** - * sendBinaryStream - * - * Send out the datagram to specified remote address and port. - * - * @param host The remote host name. - * @param port The remote port. - * @param stream The input stream to be sent. This must be a buffered stream implementation. - */ - void sendBinaryStream(in AUTF8String host, in unsigned short port, - in nsIInputStream stream); - - /** - * sendBinaryStreamWithAddress - * - * Send out the datagram to specified remote address and port. - * - * @param addr The remote host address. - * @param stream The input stream to be sent. This must be a buffered stream implementation. - */ - void sendBinaryStreamWithAddress([const] in NetAddrPtr addr, - in nsIInputStream stream); - /** * joinMulticast * diff --git a/netwerk/base/src/nsUDPSocket.cpp b/netwerk/base/src/nsUDPSocket.cpp index 03a82300ffb..7a9705674aa 100644 --- a/netwerk/base/src/nsUDPSocket.cpp +++ b/netwerk/base/src/nsUDPSocket.cpp @@ -31,7 +31,6 @@ using namespace mozilla::net; using namespace mozilla; static NS_DEFINE_CID(kSocketTransportServiceCID, NS_SOCKETTRANSPORTSERVICE_CID); -static const uint32_t UDP_PACKET_CHUNK_SIZE = 1400; //----------------------------------------------------------------------------- @@ -480,7 +479,7 @@ nsUDPSocket::OnSocketReady(PRFileDesc *fd, int16_t outFlags) nsCOMPtr pipeIn; nsCOMPtr pipeOut; - uint32_t segsize = UDP_PACKET_CHUNK_SIZE; + uint32_t segsize = 1400; uint32_t segcount = 0; net_ResolveSegmentParams(segsize, segcount); nsresult rv = NS_NewPipe2(getter_AddRefs(pipeIn), getter_AddRefs(pipeOut), @@ -492,7 +491,7 @@ nsUDPSocket::OnSocketReady(PRFileDesc *fd, int16_t outFlags) nsRefPtr os = new nsUDPOutputStream(this, mFD, prClientAddr); rv = NS_AsyncCopy(pipeIn, os, mSts, - NS_ASYNCCOPY_VIA_READSEGMENTS, UDP_PACKET_CHUNK_SIZE); + NS_ASYNCCOPY_VIA_READSEGMENTS, 1400); if (NS_FAILED(rv)) { return; @@ -553,7 +552,7 @@ NS_IMPL_ISUPPORTS(nsUDPSocket, nsIUDPSocket) //----------------------------------------------------------------------------- NS_IMETHODIMP -nsUDPSocket::Init(int32_t aPort, bool aLoopbackOnly, bool aAddressReuse, uint8_t aOptionalArgc) +nsUDPSocket::Init(int32_t aPort, bool aLoopbackOnly) { NetAddr addr; @@ -568,16 +567,14 @@ nsUDPSocket::Init(int32_t aPort, bool aLoopbackOnly, bool aAddressReuse, uint8_t else addr.inet.ip = htonl(INADDR_ANY); - return InitWithAddress(&addr, aAddressReuse, aOptionalArgc); + return InitWithAddress(&addr); } NS_IMETHODIMP -nsUDPSocket::InitWithAddress(const NetAddr *aAddr, bool aAddressReuse, uint8_t aOptionalArgc) +nsUDPSocket::InitWithAddress(const NetAddr *aAddr) { NS_ENSURE_TRUE(mFD == nullptr, NS_ERROR_ALREADY_INITIALIZED); - bool addressReuse = (aOptionalArgc == 1) ? aAddressReuse : true; - // // configure listening socket... // @@ -601,7 +598,7 @@ nsUDPSocket::InitWithAddress(const NetAddr *aAddr, bool aAddressReuse, uint8_t a // to port 0 with SO_REUSEADDR if (port) { opt.option = PR_SockOpt_Reuseaddr; - opt.value.reuse_addr = addressReuse; + opt.value.reuse_addr = true; PR_SetSocketOption(mFD, &opt); } @@ -671,17 +668,6 @@ nsUDPSocket::GetPort(int32_t *aResult) return rv; } -NS_IMETHODIMP -nsUDPSocket::GetLocalAddr(nsINetAddr * *aResult) -{ - NS_ENSURE_ARG_POINTER(aResult); - - nsCOMPtr result = new nsNetAddr(&mAddr); - result.forget(aResult); - - return NS_OK; -} - NS_IMETHODIMP nsUDPSocket::GetAddress(NetAddr *aResult) { @@ -843,47 +829,6 @@ PendingSend::OnLookupComplete(nsICancelable *request, return NS_OK; } -class PendingSendStream : public nsIDNSListener -{ -public: - NS_DECL_THREADSAFE_ISUPPORTS - NS_DECL_NSIDNSLISTENER - - PendingSendStream(nsUDPSocket *aSocket, uint16_t aPort, - nsIInputStream *aStream) - : mSocket(aSocket) - , mPort(aPort) - , mStream(aStream) {} - -private: - virtual ~PendingSendStream() {} - - nsRefPtr mSocket; - uint16_t mPort; - nsCOMPtr mStream; -}; - -NS_IMPL_ISUPPORTS(PendingSendStream, nsIDNSListener) - -NS_IMETHODIMP -PendingSendStream::OnLookupComplete(nsICancelable *request, - nsIDNSRecord *rec, - nsresult status) -{ - if (NS_FAILED(status)) { - NS_WARNING("Failed to send UDP packet due to DNS lookup failure"); - return NS_OK; - } - - NetAddr addr; - if (NS_SUCCEEDED(rec->GetNextAddr(mPort, &addr))) { - nsresult rv = mSocket->SendBinaryStreamWithAddress(&addr, mStream); - NS_ENSURE_SUCCESS(rv, rv); - } - - return NS_OK; -} - class SendRequestRunnable: public nsRunnable { public: SendRequestRunnable(nsUDPSocket *aSocket, @@ -1008,32 +953,6 @@ nsUDPSocket::SendWithAddress(const NetAddr *aAddr, const uint8_t *aData, return NS_OK; } -NS_IMETHODIMP -nsUDPSocket::SendBinaryStream(const nsACString &aHost, uint16_t aPort, - nsIInputStream *aStream) -{ - NS_ENSURE_ARG(aStream); - - nsCOMPtr listener = new PendingSendStream(this, aPort, aStream); - - return ResolveHost(aHost, listener); -} - -NS_IMETHODIMP -nsUDPSocket::SendBinaryStreamWithAddress(const NetAddr *aAddr, nsIInputStream *aStream) -{ - NS_ENSURE_ARG(aAddr); - NS_ENSURE_ARG(aStream); - - PRNetAddr prAddr; - PR_InitializeNetAddr(PR_IpAddrAny, 0, &prAddr); - NetAddrToPRNetAddr(aAddr, &prAddr); - - nsRefPtr os = new nsUDPOutputStream(this, mFD, prAddr); - return NS_AsyncCopy(aStream, os, mSts, NS_ASYNCCOPY_VIA_READSEGMENTS, - UDP_PACKET_CHUNK_SIZE); -} - nsresult nsUDPSocket::SetSocketOption(const PRSocketOptionData& aOpt) { diff --git a/netwerk/ipc/NeckoChild.cpp b/netwerk/ipc/NeckoChild.cpp index 9596c3f4443..d7d96c91977 100644 --- a/netwerk/ipc/NeckoChild.cpp +++ b/netwerk/ipc/NeckoChild.cpp @@ -237,7 +237,9 @@ NeckoChild::DeallocPTCPServerSocketChild(PTCPServerSocketChild* child) } PUDPSocketChild* -NeckoChild::AllocPUDPSocketChild(const nsCString& aFilter) +NeckoChild::AllocPUDPSocketChild(const nsCString& aHost, + const uint16_t& aPort, + const nsCString& aFilter) { NS_NOTREACHED("AllocPUDPSocket should not be called"); return nullptr; diff --git a/netwerk/ipc/NeckoChild.h b/netwerk/ipc/NeckoChild.h index 874cf6386ea..2f6615b4cc8 100644 --- a/netwerk/ipc/NeckoChild.h +++ b/netwerk/ipc/NeckoChild.h @@ -51,7 +51,9 @@ protected: const uint16_t& aBacklog, const nsString& aBinaryType) MOZ_OVERRIDE; virtual bool DeallocPTCPServerSocketChild(PTCPServerSocketChild*) MOZ_OVERRIDE; - virtual PUDPSocketChild* AllocPUDPSocketChild(const nsCString& aFilter) MOZ_OVERRIDE; + virtual PUDPSocketChild* AllocPUDPSocketChild(const nsCString& aHost, + const uint16_t& aPort, + const nsCString& aFilter) MOZ_OVERRIDE; virtual bool DeallocPUDPSocketChild(PUDPSocketChild*) MOZ_OVERRIDE; virtual PDNSRequestChild* AllocPDNSRequestChild(const nsCString& aHost, const uint32_t& aFlags) MOZ_OVERRIDE; diff --git a/netwerk/ipc/NeckoParent.cpp b/netwerk/ipc/NeckoParent.cpp index 7a5409a10f1..af15a7e7c21 100644 --- a/netwerk/ipc/NeckoParent.cpp +++ b/netwerk/ipc/NeckoParent.cpp @@ -31,6 +31,7 @@ #include "nsPrintfCString.h" #include "nsHTMLDNSPrefetch.h" #include "nsIAppsService.h" +#include "nsIUDPSocketFilter.h" #include "nsEscape.h" #include "RemoteOpenFileParent.h" #include "SerializedLoadContext.h" @@ -451,18 +452,45 @@ NeckoParent::DeallocPTCPServerSocketParent(PTCPServerSocketParent* actor) } PUDPSocketParent* -NeckoParent::AllocPUDPSocketParent(const nsCString& /* unused */) +NeckoParent::AllocPUDPSocketParent(const nsCString& aHost, + const uint16_t& aPort, + const nsCString& aFilter) { - nsRefPtr p = new UDPSocketParent(); + UDPSocketParent* p = nullptr; - return p.forget().take(); + // Only allow socket if it specifies a valid packet filter. + nsAutoCString contractId(NS_NETWORK_UDP_SOCKET_FILTER_HANDLER_PREFIX); + contractId.Append(aFilter); + + if (!aFilter.IsEmpty()) { + nsCOMPtr filterHandler = + do_GetService(contractId.get()); + if (filterHandler) { + nsCOMPtr filter; + nsresult rv = filterHandler->NewFilter(getter_AddRefs(filter)); + if (NS_SUCCEEDED(rv)) { + p = new UDPSocketParent(filter); + } else { + printf_stderr("Cannot create filter that content specified. " + "filter name: %s, error code: %d.", aFilter.get(), rv); + } + } else { + printf_stderr("Content doesn't have a valid filter. " + "filter name: %s.", aFilter.get()); + } + } + + NS_IF_ADDREF(p); + return p; } bool NeckoParent::RecvPUDPSocketConstructor(PUDPSocketParent* aActor, + const nsCString& aHost, + const uint16_t& aPort, const nsCString& aFilter) { - return static_cast(aActor)->Init(aFilter); + return static_cast(aActor)->Init(aHost, aPort); } bool diff --git a/netwerk/ipc/NeckoParent.h b/netwerk/ipc/NeckoParent.h index bc7023e67f4..1eb150e96ce 100644 --- a/netwerk/ipc/NeckoParent.h +++ b/netwerk/ipc/NeckoParent.h @@ -156,8 +156,13 @@ protected: const uint16_t& aBacklog, const nsString& aBinaryType) MOZ_OVERRIDE; virtual bool DeallocPTCPServerSocketParent(PTCPServerSocketParent*) MOZ_OVERRIDE; - virtual PUDPSocketParent* AllocPUDPSocketParent(const nsCString& aFilter) MOZ_OVERRIDE; - virtual bool RecvPUDPSocketConstructor(PUDPSocketParent*, const nsCString& aFilter) MOZ_OVERRIDE; + virtual PUDPSocketParent* AllocPUDPSocketParent(const nsCString& aHost, + const uint16_t& aPort, + const nsCString& aFilter) MOZ_OVERRIDE; + virtual bool RecvPUDPSocketConstructor(PUDPSocketParent*, + const nsCString& aHost, + const uint16_t& aPort, + const nsCString& aFilter) MOZ_OVERRIDE; virtual bool DeallocPUDPSocketParent(PUDPSocketParent*) MOZ_OVERRIDE; virtual PDNSRequestParent* AllocPDNSRequestParent(const nsCString& aHost, const uint32_t& aFlags) MOZ_OVERRIDE; diff --git a/netwerk/ipc/PNecko.ipdl b/netwerk/ipc/PNecko.ipdl index b19d0e27239..0bc6036ed2a 100644 --- a/netwerk/ipc/PNecko.ipdl +++ b/netwerk/ipc/PNecko.ipdl @@ -69,7 +69,7 @@ parent: PWebSocket(PBrowserOrId browser, SerializedLoadContext loadContext); PTCPServerSocket(uint16_t localPort, uint16_t backlog, nsString binaryType); - PUDPSocket(nsCString filter); + PUDPSocket(nsCString host, uint16_t port, nsCString filter); PDNSRequest(nsCString hostName, uint32_t flags); diff --git a/netwerk/test/TestUDPSocket.cpp b/netwerk/test/TestUDPSocket.cpp index e82f9cacde6..2baebf80c96 100644 --- a/netwerk/test/TestUDPSocket.cpp +++ b/netwerk/test/TestUDPSocket.cpp @@ -273,7 +273,7 @@ main(int32_t argc, char *argv[]) nsRefPtr serverListener = new UDPServerListener(); // Bind server socket to 0.0.0.0 - rv = server->Init(0, false, true, 0); + rv = server->Init(0, false); NS_ENSURE_SUCCESS(rv, -1); int32_t serverPort; server->GetPort(&serverPort); @@ -281,7 +281,7 @@ main(int32_t argc, char *argv[]) // Bind clinet on arbitrary port nsRefPtr clientListener = new UDPClientListener(); - client->Init(0, false, true, 0); + client->Init(0, false); client->AsyncListen(clientListener); // Write data to server diff --git a/netwerk/test/unit/test_bug952927.js b/netwerk/test/unit/test_bug952927.js new file mode 100644 index 00000000000..4c317431d71 --- /dev/null +++ b/netwerk/test/unit/test_bug952927.js @@ -0,0 +1,31 @@ +var rawData = new Uint8Array([65,66,67,68]); +var data = String.fromCharCode.apply(null, rawData); + +function UDPSocketListener(){} + +UDPSocketListener.prototype = { + QueryInterface : XPCOMUtils.generateQI([Ci.nsIUDPSocketListener]), + + onPacketReceived : function(aSocket, aMessage){ + var mData = String.fromCharCode.apply(null, aMessage.rawData); + do_check_eq(mData, data); + do_check_eq(mData, aMessage.data); + do_test_finished(); + }, + + onStopListening: function(aSocket, aStatus){} +}; + + +function run_test(){ + var socket = Cc["@mozilla.org/network/udp-socket;1"].createInstance(Ci.nsIUDPSocket); + + socket.init(-1, true); + do_print("Port assigned : " + socket.port); + socket.asyncListen(new UDPSocketListener()); + + var written = socket.send("127.0.0.1", socket.port, rawData, rawData.length); + do_check_eq(written, data.length); + do_test_pending(); +} + diff --git a/netwerk/test/unit/test_udpsocket.js b/netwerk/test/unit/test_udpsocket.js deleted file mode 100644 index 3668fc480f8..00000000000 --- a/netwerk/test/unit/test_udpsocket.js +++ /dev/null @@ -1,61 +0,0 @@ -/* -*- Mode: Javasript; indent-tab-mode: nil; js-indent-level: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -"use strict"; - -const HELLO_WORLD = "Hello World"; - -add_test(function test_udp_message_raw_data() { - do_print("test for nsIUDPMessage.rawData"); - - let socket = Cc["@mozilla.org/network/udp-socket;1"].createInstance(Ci.nsIUDPSocket); - - socket.init(-1, true); - do_print("Port assigned : " + socket.port); - socket.asyncListen({ - QueryInterface : XPCOMUtils.generateQI([Ci.nsIUDPSocketListener]), - onPacketReceived : function(aSocket, aMessage){ - let recv_data = String.fromCharCode.apply(null, aMessage.rawData); - do_check_eq(recv_data, HELLO_WORLD); - do_check_eq(recv_data, aMessage.data); - socket.close(); - run_next_test(); - }, - onStopListening: function(aSocket, aStatus){} - }); - - let rawData = new Uint8Array(HELLO_WORLD.length); - for (let i = 0; i < HELLO_WORLD.length; i++) { - rawData[i] = HELLO_WORLD.charCodeAt(i); - } - let written = socket.send("127.0.0.1", socket.port, rawData, rawData.length); - do_check_eq(written, HELLO_WORLD.length); -}); - -add_test(function test_udp_send_stream() { - do_print("test for nsIUDPSocket.sendBinaryStream"); - - let socket = Cc["@mozilla.org/network/udp-socket;1"].createInstance(Ci.nsIUDPSocket); - - socket.init(-1, true); - socket.asyncListen({ - QueryInterface : XPCOMUtils.generateQI([Ci.nsIUDPSocketListener]), - onPacketReceived : function(aSocket, aMessage){ - let recv_data = String.fromCharCode.apply(null, aMessage.rawData); - do_check_eq(recv_data, HELLO_WORLD); - socket.close(); - run_next_test(); - }, - onStopListening: function(aSocket, aStatus){} - }); - - let stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); - stream.setData(HELLO_WORLD, HELLO_WORLD.length); - socket.sendBinaryStream("127.0.0.1", socket.port, stream); -}); - -function run_test(){ - run_next_test(); -} - diff --git a/netwerk/test/unit/xpcshell.ini b/netwerk/test/unit/xpcshell.ini index 6f01b28f216..fa5ac8d87c1 100644 --- a/netwerk/test/unit/xpcshell.ini +++ b/netwerk/test/unit/xpcshell.ini @@ -149,7 +149,7 @@ skip-if = os == "android" # Allocating 4GB might actually succeed on 64 bit machines skip-if = bits != 32 [test_bug935499.js] -[test_udpsocket.js] +[test_bug952927.js] [test_doomentry.js] [test_cacheflags.js] [test_cache_jar.js]