зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1148307 - Part 2 - let session transport send DOM string. r=smaug
This commit is contained in:
Родитель
d6cfc97f77
Коммит
248ceef0ca
|
@ -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();
|
||||
|
|
Загрузка…
Ссылка в новой задаче