diff --git a/dom/workers/XMLHttpRequest.cpp b/dom/workers/XMLHttpRequest.cpp index c8dbfe291d8e..9fa53f44fb44 100644 --- a/dom/workers/XMLHttpRequest.cpp +++ b/dom/workers/XMLHttpRequest.cpp @@ -181,6 +181,9 @@ protected: WorkerPrivate* mWorkerPrivate; RefPtr mProxy; nsCOMPtr mSyncLoopTarget; + // mRv is set on the worker thread by the constructor. Must not be touched on + // the main thread, except for copying the reference to the ResponseRunnable. + ErrorResult& mRv; private: class ResponseRunnable final: public MainThreadStopSyncLoopRunnable @@ -212,8 +215,9 @@ private: }; public: - WorkerThreadProxySyncRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy) - : mWorkerPrivate(aWorkerPrivate), mProxy(aProxy) + WorkerThreadProxySyncRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + ErrorResult& aRv) + : mWorkerPrivate(aWorkerPrivate), mProxy(aProxy), mRv(aRv) { MOZ_ASSERT(aWorkerPrivate); MOZ_ASSERT(aProxy); @@ -258,8 +262,8 @@ class SendRunnable final public: SendRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - const nsAString& aStringBody) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) + const nsAString& aStringBody, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv) , StructuredCloneHolder(CloningSupported, TransferringNotSupported, SameProcessDifferentThread) , mStringBody(aStringBody) @@ -608,8 +612,9 @@ private: class SyncTeardownRunnable final : public WorkerThreadProxySyncRunnable { public: - SyncTeardownRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) + SyncTeardownRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv) { } private: @@ -632,8 +637,8 @@ class SetBackgroundRequestRunnable final : public: SetBackgroundRequestRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - bool aValue) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mValue(aValue) + bool aValue, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), mValue(aValue) { } private: @@ -654,8 +659,8 @@ class SetWithCredentialsRunnable final : public: SetWithCredentialsRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - bool aValue) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mValue(aValue) + bool aValue, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), mValue(aValue) { } private: @@ -675,8 +680,8 @@ class SetResponseTypeRunnable final : public WorkerThreadProxySyncRunnable public: SetResponseTypeRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - const nsAString& aResponseType) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), + const nsAString& aResponseType, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), mResponseType(aResponseType) { } @@ -708,8 +713,9 @@ class SetTimeoutRunnable final : public WorkerThreadProxySyncRunnable public: SetTimeoutRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - uint32_t aTimeout) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mTimeout(aTimeout) + uint32_t aTimeout, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), + mTimeout(aTimeout) { } private: @@ -726,8 +732,8 @@ private: class AbortRunnable final : public WorkerThreadProxySyncRunnable { public: - AbortRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) + AbortRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv) { } private: @@ -745,8 +751,8 @@ class GetAllResponseHeadersRunnable final : public: GetAllResponseHeadersRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - nsCString& aResponseHeaders) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), + nsCString& aResponseHeaders, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), mResponseHeaders(aResponseHeaders) { } @@ -769,8 +775,10 @@ class GetResponseHeaderRunnable final : public WorkerThreadProxySyncRunnable public: GetResponseHeaderRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - const nsACString& aHeader, nsCString& aValue) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mHeader(aHeader), + const nsACString& aHeader, nsCString& aValue, + ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), + mHeader(aHeader), mValue(aValue) { } @@ -803,8 +811,9 @@ public: const Optional& aUser, const Optional& aPassword, bool aBackgroundRequest, bool aWithCredentials, - uint32_t aTimeout) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mMethod(aMethod), + uint32_t aTimeout, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), + mMethod(aMethod), mURL(aURL), mBackgroundRequest(aBackgroundRequest), mWithCredentials(aWithCredentials), mTimeout(aTimeout) { @@ -845,8 +854,10 @@ class SetRequestHeaderRunnable final : public WorkerThreadProxySyncRunnable public: SetRequestHeaderRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - const nsACString& aHeader, const nsACString& aValue) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mHeader(aHeader), + const nsACString& aHeader, const nsACString& aValue, + ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), + mHeader(aHeader), mValue(aValue) { } @@ -867,8 +878,9 @@ class OverrideMimeTypeRunnable final : public WorkerThreadProxySyncRunnable public: OverrideMimeTypeRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - const nsAString& aMimeType) - : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mMimeType(aMimeType) + const nsAString& aMimeType, ErrorResult& aRv) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy, aRv), + mMimeType(aMimeType) { } private: @@ -1683,8 +1695,9 @@ XMLHttpRequest::ReleaseProxy(ReleaseType aType) } // We need to make a sync call here. + ErrorResult ignored; RefPtr runnable = - new SyncTeardownRunnable(mWorkerPrivate, mProxy); + new SyncTeardownRunnable(mWorkerPrivate, mProxy, ignored); mProxy = nullptr; if (!runnable->Dispatch()) { @@ -1931,7 +1944,7 @@ XMLHttpRequest::Open(const nsACString& aMethod, const nsAString& aUrl, RefPtr runnable = new OpenRunnable(mWorkerPrivate, mProxy, aMethod, aUrl, aUser, aPassword, mBackgroundRequest, mWithCredentials, - mTimeout); + mTimeout, aRv); ++mProxy->mOpenCount; if (!runnable->Dispatch()) { @@ -1970,7 +1983,7 @@ XMLHttpRequest::SetRequestHeader(const nsACString& aHeader, } RefPtr runnable = - new SetRequestHeaderRunnable(mWorkerPrivate, mProxy, aHeader, aValue); + new SetRequestHeaderRunnable(mWorkerPrivate, mProxy, aHeader, aValue, aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return; @@ -1996,7 +2009,7 @@ XMLHttpRequest::SetTimeout(uint32_t aTimeout, ErrorResult& aRv) } RefPtr runnable = - new SetTimeoutRunnable(mWorkerPrivate, mProxy, aTimeout); + new SetTimeoutRunnable(mWorkerPrivate, mProxy, aTimeout, aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return; @@ -2022,7 +2035,8 @@ XMLHttpRequest::SetWithCredentials(bool aWithCredentials, ErrorResult& aRv) } RefPtr runnable = - new SetWithCredentialsRunnable(mWorkerPrivate, mProxy, aWithCredentials); + new SetWithCredentialsRunnable(mWorkerPrivate, mProxy, aWithCredentials, + aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return; @@ -2050,7 +2064,7 @@ XMLHttpRequest::SetMozBackgroundRequest(bool aBackgroundRequest, RefPtr runnable = new SetBackgroundRequestRunnable(mWorkerPrivate, mProxy, - aBackgroundRequest); + aBackgroundRequest, aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return; @@ -2095,7 +2109,7 @@ XMLHttpRequest::Send(ErrorResult& aRv) } RefPtr sendRunnable = - new SendRunnable(mWorkerPrivate, mProxy, NullString()); + new SendRunnable(mWorkerPrivate, mProxy, NullString(), aRv); // Nothing to clone. SendInternal(sendRunnable, aRv); @@ -2117,7 +2131,7 @@ XMLHttpRequest::Send(const nsAString& aBody, ErrorResult& aRv) } RefPtr sendRunnable = - new SendRunnable(mWorkerPrivate, mProxy, aBody); + new SendRunnable(mWorkerPrivate, mProxy, aBody, aRv); // Nothing to clone. SendInternal(sendRunnable, aRv); @@ -2157,7 +2171,7 @@ XMLHttpRequest::Send(JS::Handle aBody, ErrorResult& aRv) } RefPtr sendRunnable = - new SendRunnable(mWorkerPrivate, mProxy, EmptyString()); + new SendRunnable(mWorkerPrivate, mProxy, EmptyString(), aRv); sendRunnable->Write(cx, valToClone, aRv); if (NS_WARN_IF(aRv.Failed())) { @@ -2198,7 +2212,7 @@ XMLHttpRequest::Send(Blob& aBody, ErrorResult& aRv) } RefPtr sendRunnable = - new SendRunnable(mWorkerPrivate, mProxy, EmptyString()); + new SendRunnable(mWorkerPrivate, mProxy, EmptyString(), aRv); sendRunnable->Write(cx, value, aRv); if (NS_WARN_IF(aRv.Failed())) { @@ -2231,7 +2245,7 @@ XMLHttpRequest::Send(FormData& aBody, ErrorResult& aRv) } RefPtr sendRunnable = - new SendRunnable(mWorkerPrivate, mProxy, EmptyString()); + new SendRunnable(mWorkerPrivate, mProxy, EmptyString(), aRv); sendRunnable->Write(cx, value, aRv); if (NS_WARN_IF(aRv.Failed())) { @@ -2288,7 +2302,8 @@ XMLHttpRequest::Abort(ErrorResult& aRv) mProxy->mOuterEventStreamId++; - RefPtr runnable = new AbortRunnable(mWorkerPrivate, mProxy); + RefPtr runnable = + new AbortRunnable(mWorkerPrivate, mProxy, aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return; @@ -2314,7 +2329,7 @@ XMLHttpRequest::GetResponseHeader(const nsACString& aHeader, nsCString responseHeader; RefPtr runnable = new GetResponseHeaderRunnable(mWorkerPrivate, mProxy, aHeader, - responseHeader); + responseHeader, aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return; @@ -2340,7 +2355,8 @@ XMLHttpRequest::GetAllResponseHeaders(nsACString& aResponseHeaders, nsCString responseHeaders; RefPtr runnable = - new GetAllResponseHeadersRunnable(mWorkerPrivate, mProxy, responseHeaders); + new GetAllResponseHeadersRunnable(mWorkerPrivate, mProxy, responseHeaders, + aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return; @@ -2372,7 +2388,8 @@ XMLHttpRequest::OverrideMimeType(const nsAString& aMimeType, ErrorResult& aRv) } RefPtr runnable = - new OverrideMimeTypeRunnable(mWorkerPrivate, mProxy, aMimeType); + new OverrideMimeTypeRunnable(mWorkerPrivate, mProxy, aMimeType, + aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return; @@ -2407,7 +2424,7 @@ XMLHttpRequest::SetResponseType(XMLHttpRequestResponseType aResponseType, ConvertResponseTypeToString(aResponseType, responseType); RefPtr runnable = - new SetResponseTypeRunnable(mWorkerPrivate, mProxy, responseType); + new SetResponseTypeRunnable(mWorkerPrivate, mProxy, responseType, aRv); if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); return;