Bug 1399466 - IPCBlobInputStream should not use STS to read from the remote Stream, but DOMFile thread instead, r=smaug

This commit is contained in:
Andrea Marchesini
2017-09-13 15:37:49 +02:00
parent 4cd6e73597
commit cb69e6d3c1
3 changed files with 25 additions and 24 deletions

View File

@@ -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:
@@ -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);

View File

@@ -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,

View File

@@ -34,6 +34,9 @@ public:
void void
Initialize(); Initialize();
nsIEventTarget*
EventTarget() const;
private: private:
~IPCBlobInputStreamThread() = default; ~IPCBlobInputStreamThread() = default;