Bug 1148307 - Part 2 - let session transport send DOM string. r=smaug

This commit is contained in:
Junior Hsu 2016-04-11 11:20:55 +08:00
Родитель d6cfc97f77
Коммит 248ceef0ca
12 изменённых файлов: 67 добавлений и 74 удалений

Просмотреть файл

@ -126,21 +126,6 @@ PresentationConnection::Send(const nsAString& aData,
return;
}
nsresult rv;
nsCOMPtr<nsIStringInputStream> stream =
do_CreateInstance(NS_STRINGINPUTSTREAM_CONTRACTID, &rv);
if(NS_WARN_IF(NS_FAILED(rv))) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
NS_ConvertUTF16toUTF8 msgString(aData);
rv = stream->SetData(msgString.BeginReading(), msgString.Length());
if(NS_WARN_IF(NS_FAILED(rv))) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
nsCOMPtr<nsIPresentationService> service =
do_GetService(PRESENTATION_SERVICE_CONTRACTID);
if(NS_WARN_IF(!service)) {
@ -148,7 +133,7 @@ PresentationConnection::Send(const nsAString& aData,
return;
}
rv = service->SendSessionMessage(mId, stream);
nsresult rv = service->SendSessionMessage(mId, aData);
if(NS_WARN_IF(NS_FAILED(rv))) {
aRv.Throw(NS_ERROR_DOM_OPERATION_ERR);
}

Просмотреть файл

@ -460,10 +460,10 @@ PresentationService::StartSession(const nsAString& aUrl,
NS_IMETHODIMP
PresentationService::SendSessionMessage(const nsAString& aSessionId,
nsIInputStream* aStream)
const nsAString& aData)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aStream);
MOZ_ASSERT(!aData.IsEmpty());
MOZ_ASSERT(!aSessionId.IsEmpty());
RefPtr<PresentationSessionInfo> info = GetSessionInfo(aSessionId);
@ -471,7 +471,7 @@ PresentationService::SendSessionMessage(const nsAString& aSessionId,
return NS_ERROR_NOT_AVAILABLE;
}
return info->Send(aStream);
return info->Send(aData);
}
NS_IMETHODIMP

Просмотреть файл

@ -266,7 +266,7 @@ PresentationSessionInfo::SetListener(nsIPresentationSessionListener* aListener)
}
nsresult
PresentationSessionInfo::Send(nsIInputStream* aData)
PresentationSessionInfo::Send(const nsAString& aData)
{
if (NS_WARN_IF(!IsSessionReady())) {
return NS_ERROR_DOM_INVALID_STATE_ERR;

Просмотреть файл

@ -92,7 +92,7 @@ public:
}
}
nsresult Send(nsIInputStream* aData);
nsresult Send(const nsAString& aData);
nsresult Close(nsresult aReason,
uint32_t aState);

Просмотреть файл

@ -107,21 +107,23 @@ PresentationTCPSessionTransport::BuildTCPSenderTransport(nsISocketTransport* aTr
return rv;
}
SetReadyState(ReadyState::OPEN);
if (IsReadyToNotifyData()) {
return CreateInputStreamPump();
}
mType = nsIPresentationSessionTransportBuilder::TYPE_SENDER;
nsCOMPtr<nsIPresentationSessionTransport> sessionTransport = do_QueryObject(this);
nsCOMPtr<nsIRunnable> runnable =
nsCOMPtr<nsIRunnable> onSessionTransportRunnable =
NS_NewRunnableMethodWithArgs
<nsIPresentationSessionTransport*>(mListener,
&nsIPresentationSessionTransportBuilderListener::OnSessionTransport,
sessionTransport);
return NS_DispatchToCurrentThread(runnable);
NS_DispatchToCurrentThread(onSessionTransportRunnable);
nsCOMPtr<nsIRunnable> setReadyStateRunnable =
NS_NewRunnableMethodWithArgs<ReadyState>(this,
&PresentationTCPSessionTransport::SetReadyState,
ReadyState::OPEN);
return NS_DispatchToCurrentThread(setReadyStateRunnable);
}
NS_IMETHODIMP
@ -272,6 +274,10 @@ PresentationTCPSessionTransport::CreateStream()
nsresult
PresentationTCPSessionTransport::CreateInputStreamPump()
{
if (NS_WARN_IF(mInputStreamPump)) {
return NS_OK;
}
nsresult rv;
mInputStreamPump = do_CreateInstance(NS_INPUTSTREAMPUMP_CONTRACTID, &rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
@ -381,13 +387,26 @@ PresentationTCPSessionTransport::NotifyCopyComplete(nsresult aStatus)
}
NS_IMETHODIMP
PresentationTCPSessionTransport::Send(nsIInputStream* aData)
PresentationTCPSessionTransport::Send(const nsAString& aData)
{
if (NS_WARN_IF(mReadyState != ReadyState::OPEN)) {
return NS_ERROR_DOM_INVALID_STATE_ERR;
}
mMultiplexStream->AppendStream(aData);
nsresult rv;
nsCOMPtr<nsIStringInputStream> stream =
do_CreateInstance(NS_STRINGINPUTSTREAM_CONTRACTID, &rv);
if(NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_DOM_INVALID_STATE_ERR;
}
NS_ConvertUTF16toUTF8 msgString(aData);
rv = stream->SetData(msgString.BeginReading(), msgString.Length());
if(NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_DOM_INVALID_STATE_ERR;
}
mMultiplexStream->AppendStream(stream);
EnsureCopying();
@ -425,10 +444,22 @@ PresentationTCPSessionTransport::SetReadyState(ReadyState aReadyState)
{
mReadyState = aReadyState;
if (mReadyState == ReadyState::OPEN && mCallback) {
if (mReadyState == ReadyState::OPEN) {
if (IsReadyToNotifyData()) {
CreateInputStreamPump();
}
if (NS_WARN_IF(!mCallback)) {
return;
}
// Notify the transport channel is ready.
NS_WARN_IF(NS_FAILED(mCallback->NotifyTransportReady()));
} else if (mReadyState == ReadyState::CLOSED && mCallback) {
if (NS_WARN_IF(!mCallback)) {
return;
}
// Notify the transport channel has been shut down.
NS_WARN_IF(NS_FAILED(mCallback->NotifyTransportClosed(mCloseStatus)));
mCallback = nullptr;
@ -452,10 +483,6 @@ PresentationTCPSessionTransport::OnTransportStatus(nsITransport* aTransport,
SetReadyState(ReadyState::OPEN);
if (IsReadyToNotifyData()) {
return CreateInputStreamPump();
}
return NS_OK;
}

Просмотреть файл

@ -33,7 +33,7 @@ interface nsIPresentationServiceCallback : nsISupports
void notifyError(in nsresult error);
};
[scriptable, uuid(2e360359-c45c-4949-bf95-410242ce483f)]
[scriptable, uuid(61864149-9838-4aa1-a21a-63eaf0b84a8c)]
interface nsIPresentationService : nsISupports
{
/*
@ -57,13 +57,13 @@ interface nsIPresentationService : nsISupports
in nsIPresentationServiceCallback callback);
/*
* Send the message wrapped with an input stream to the session.
* Send the message to the session.
*
* @param sessionId: An ID to identify presentation session.
* @param stream: The message is converted to an input stream.
* @param data: the message being sent out.
*/
void sendSessionMessage(in DOMString sessionId,
in nsIInputStream stream);
in DOMString data);
/*
* Close the session.

Просмотреть файл

@ -26,7 +26,7 @@ interface nsIPresentationSessionTransportCallback : nsISupports
/*
* App-to-App transport channel for the presentation session.
*/
[scriptable, uuid(7af8556e-e37b-4ca1-a5dd-029567172863)]
[scriptable, uuid(670b7e1b-65be-42b6-a596-be571907fa18)]
interface nsIPresentationSessionTransport : nsISupports
{
// Should be set once the underlying session transport is built
@ -46,7 +46,7 @@ interface nsIPresentationSessionTransport : nsISupports
* Send message to the remote endpoint.
* @param data The message to send.
*/
void send(in nsIInputStream data);
void send(in DOMString data);
/*
* Close this session transport.

Просмотреть файл

@ -23,7 +23,7 @@ struct StartSessionRequest
struct SendSessionMessageRequest
{
nsString sessionId;
InputStreamParams data;
nsString data;
};
struct CloseSessionRequest

Просмотреть файл

@ -60,17 +60,13 @@ PresentationIPCService::StartSession(const nsAString& aUrl,
NS_IMETHODIMP
PresentationIPCService::SendSessionMessage(const nsAString& aSessionId,
nsIInputStream* aStream)
const nsAString& aData)
{
MOZ_ASSERT(!aSessionId.IsEmpty());
MOZ_ASSERT(aStream);
MOZ_ASSERT(!aData.IsEmpty());
mozilla::ipc::OptionalInputStreamParams stream;
nsTArray<mozilla::ipc::FileDescriptor> fds;
SerializeInputStream(aStream, stream, fds);
MOZ_ASSERT(fds.IsEmpty());
return SendRequest(nullptr, SendSessionMessageRequest(nsAutoString(aSessionId), stream));
return SendRequest(nullptr, SendSessionMessageRequest(nsAutoString(aSessionId),
nsAutoString(aData)));
}
NS_IMETHODIMP

Просмотреть файл

@ -267,13 +267,8 @@ PresentationRequestParent::DoRequest(const SendSessionMessageRequest& aRequest)
return NotifyError(NS_ERROR_DOM_SECURITY_ERR);
}
nsTArray<mozilla::ipc::FileDescriptor> fds;
nsCOMPtr<nsIInputStream> stream = DeserializeInputStream(aRequest.data(), fds);
if(NS_WARN_IF(!stream)) {
return NotifyError(NS_ERROR_NOT_AVAILABLE);
}
nsresult rv = mService->SendSessionMessage(aRequest.sessionId(), stream);
nsresult rv = mService->SendSessionMessage(aRequest.sessionId(),
aRequest.data());
if (NS_WARN_IF(NS_FAILED(rv))) {
return NotifyError(rv);
}

Просмотреть файл

@ -244,11 +244,7 @@ const mockedSessionTransport = {
sendAsyncMessage('data-transport-notification-enabled');
},
send: function(data) {
var binaryStream = Cc["@mozilla.org/binaryinputstream;1"].
createInstance(Ci.nsIBinaryInputStream);
binaryStream.setInputStream(data);
var message = binaryStream.readBytes(binaryStream.available());
sendAsyncMessage('message-sent', message);
sendAsyncMessage('message-sent', data);
},
close: function(reason) {
sendAsyncMessage('data-transport-closed', reason);

Просмотреть файл

@ -161,19 +161,13 @@ function selfAddress() {
// Test the client sends a message and then a corresponding notification gets
// triggered at the server side.
function clientSendMessage() {
var stream = Cc["@mozilla.org/io/string-input-stream;1"]
.createInstance(Ci.nsIStringInputStream);
stream.setData(clientMessage, clientMessage.length);
clientTransport.send(stream);
clientTransport.send(clientMessage);
}
// Test the server sends a message an then a corresponding notification gets
// triggered at the client side.
function serverSendMessage() {
var stream = Cc["@mozilla.org/io/string-input-stream;1"]
.createInstance(Ci.nsIStringInputStream);
stream.setData(serverMessage, serverMessage.length);
serverTransport.send(stream);
serverTransport.send(serverMessage);
// The client enables data notification even after the incoming message has
// been sent, and should still be able to consume it.
clientTransport.enableDataNotification();