Bug 1399466 - IPCBlobInputStream should not use STS to read from the remote Stream, but DOMFile thread instead, r=smaug
This commit is contained in:
@@ -8,10 +8,11 @@
|
|||||||
#include "IPCBlobInputStreamChild.h"
|
#include "IPCBlobInputStreamChild.h"
|
||||||
#include "IPCBlobInputStreamStorage.h"
|
#include "IPCBlobInputStreamStorage.h"
|
||||||
#include "mozilla/ipc/InputStreamParams.h"
|
#include "mozilla/ipc/InputStreamParams.h"
|
||||||
|
#include "IPCBlobInputStreamThread.h"
|
||||||
#include "nsIAsyncInputStream.h"
|
#include "nsIAsyncInputStream.h"
|
||||||
#include "nsIStreamTransportService.h"
|
#include "nsIAsyncOutputStream.h"
|
||||||
#include "nsITransport.h"
|
#include "nsIPipe.h"
|
||||||
#include "nsNetCID.h"
|
#include "nsStreamUtils.h"
|
||||||
#include "nsStringStream.h"
|
#include "nsStringStream.h"
|
||||||
#include "SlicedInputStream.h"
|
#include "SlicedInputStream.h"
|
||||||
|
|
||||||
@@ -20,8 +21,6 @@ namespace dom {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
static NS_DEFINE_CID(kStreamTransportServiceCID, NS_STREAMTRANSPORTSERVICE_CID);
|
|
||||||
|
|
||||||
class InputStreamCallbackRunnable final : public CancelableRunnable
|
class InputStreamCallbackRunnable final : public CancelableRunnable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -511,7 +510,7 @@ IPCBlobInputStream::OnInputStreamReady(nsIAsyncInputStream* aStream)
|
|||||||
|
|
||||||
nsCOMPtr<nsIEventTarget> callbackEventTarget;
|
nsCOMPtr<nsIEventTarget> callbackEventTarget;
|
||||||
callbackEventTarget.swap(mInputStreamCallbackEventTarget);
|
callbackEventTarget.swap(mInputStreamCallbackEventTarget);
|
||||||
|
|
||||||
// This must be the last operation because the execution of the callback can
|
// This must be the last operation because the execution of the callback can
|
||||||
// be synchronous.
|
// be synchronous.
|
||||||
InputStreamCallbackRunnable::Execute(callback, callbackEventTarget, this);
|
InputStreamCallbackRunnable::Execute(callback, callbackEventTarget, this);
|
||||||
@@ -651,32 +650,25 @@ IPCBlobInputStream::EnsureAsyncRemoteStream()
|
|||||||
|
|
||||||
nsCOMPtr<nsIAsyncInputStream> asyncStream = do_QueryInterface(mRemoteStream);
|
nsCOMPtr<nsIAsyncInputStream> asyncStream = do_QueryInterface(mRemoteStream);
|
||||||
if (!asyncStream || !nonBlocking) {
|
if (!asyncStream || !nonBlocking) {
|
||||||
nsCOMPtr<nsIStreamTransportService> sts =
|
// Let's make the stream async using the DOMFile thread.
|
||||||
do_GetService(kStreamTransportServiceCID, &rv);
|
nsCOMPtr<nsIAsyncInputStream> pipeIn;
|
||||||
|
nsCOMPtr<nsIAsyncOutputStream> pipeOut;
|
||||||
|
rv = NS_NewPipe2(getter_AddRefs(pipeIn),
|
||||||
|
getter_AddRefs(pipeOut),
|
||||||
|
true, true);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsITransport> transport;
|
nsCOMPtr<nsIEventTarget> target =
|
||||||
rv = sts->CreateInputTransport(mRemoteStream,
|
IPCBlobInputStreamThread::GetOrCreate()->EventTarget();
|
||||||
/* aStartOffset */ 0,
|
rv = NS_AsyncCopy(mRemoteStream, pipeOut, target,
|
||||||
/* aReadLimit */ -1,
|
NS_ASYNCCOPY_VIA_WRITESEGMENTS);
|
||||||
/* aCloseWhenDone */ true,
|
|
||||||
getter_AddRefs(transport));
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIInputStream> wrapper;
|
asyncStream = pipeIn;
|
||||||
rv = transport->OpenInputStream(/* aFlags */ 0,
|
|
||||||
/* aSegmentSize */ 0,
|
|
||||||
/* aSegmentCount */ 0,
|
|
||||||
getter_AddRefs(wrapper));
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
asyncStream = do_QueryInterface(wrapper);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MOZ_ASSERT(asyncStream);
|
MOZ_ASSERT(asyncStream);
|
||||||
|
|||||||
@@ -158,6 +158,12 @@ IPCBlobInputStreamThread::Initialize()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsIEventTarget*
|
||||||
|
IPCBlobInputStreamThread::EventTarget() const
|
||||||
|
{
|
||||||
|
return mThread;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
IPCBlobInputStreamThread::Observe(nsISupports* aSubject,
|
IPCBlobInputStreamThread::Observe(nsISupports* aSubject,
|
||||||
const char* aTopic,
|
const char* aTopic,
|
||||||
|
|||||||
@@ -34,6 +34,9 @@ public:
|
|||||||
void
|
void
|
||||||
Initialize();
|
Initialize();
|
||||||
|
|
||||||
|
nsIEventTarget*
|
||||||
|
EventTarget() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
~IPCBlobInputStreamThread() = default;
|
~IPCBlobInputStreamThread() = default;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user