From 144671581e474fc872a54bead85b9d53cb05d04e Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Tue, 20 Mar 2018 23:21:24 +0200 Subject: [PATCH] Backed out changeset 0f81334efa0a (bug 1445883) for crashes (bug 1446902). a=backout --- dom/xhr/XMLHttpRequestWorker.cpp | 327 ++++++++++++------------ dom/xhr/XMLHttpRequestWorker.h | 25 +- testing/web-platform/meta/MANIFEST.json | 10 - 3 files changed, 174 insertions(+), 188 deletions(-) diff --git a/dom/xhr/XMLHttpRequestWorker.cpp b/dom/xhr/XMLHttpRequestWorker.cpp index 0e306c3909dc..8737dae7d33f 100644 --- a/dom/xhr/XMLHttpRequestWorker.cpp +++ b/dom/xhr/XMLHttpRequestWorker.cpp @@ -24,7 +24,6 @@ #include "mozilla/dom/URLSearchParams.h" #include "mozilla/dom/WorkerScope.h" #include "mozilla/dom/WorkerPrivate.h" -#include "mozilla/dom/WorkerRef.h" #include "mozilla/dom/WorkerRunnable.h" #include "mozilla/Telemetry.h" #include "nsComponentManagerUtils.h" @@ -242,8 +241,9 @@ class SendRunnable final bool mHasUploadListeners; public: - SendRunnable(Proxy* aProxy, const nsAString& aStringBody) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy) + SendRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + const nsAString& aStringBody) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) , StructuredCloneHolder(CloningSupported, TransferringNotSupported, StructuredCloneScope::SameProcessDifferentThread) , mStringBody(aStringBody) @@ -541,8 +541,8 @@ private: class SyncTeardownRunnable final : public WorkerThreadProxySyncRunnable { public: - explicit SyncTeardownRunnable(Proxy* aProxy) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy) + SyncTeardownRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) { } private: @@ -563,8 +563,9 @@ class SetBackgroundRequestRunnable final : bool mValue; public: - SetBackgroundRequestRunnable(Proxy* aProxy, bool aValue) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy) + SetBackgroundRequestRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + bool aValue) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) , mValue(aValue) { } @@ -585,8 +586,9 @@ class SetWithCredentialsRunnable final : bool mValue; public: - SetWithCredentialsRunnable(Proxy* aProxy, bool aValue) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy) + SetWithCredentialsRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + bool aValue) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) , mValue(aValue) { } @@ -606,9 +608,9 @@ class SetResponseTypeRunnable final : public WorkerThreadProxySyncRunnable XMLHttpRequestResponseType mResponseType; public: - SetResponseTypeRunnable(Proxy* aProxy, + SetResponseTypeRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, XMLHttpRequestResponseType aResponseType) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy), + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mResponseType(aResponseType) { } @@ -637,8 +639,9 @@ class SetTimeoutRunnable final : public WorkerThreadProxySyncRunnable uint32_t mTimeout; public: - SetTimeoutRunnable(Proxy* aProxy, uint32_t aTimeout) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy), + SetTimeoutRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + uint32_t aTimeout) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mTimeout(aTimeout) { } @@ -656,8 +659,8 @@ private: class AbortRunnable final : public WorkerThreadProxySyncRunnable { public: - explicit AbortRunnable(Proxy* aProxy) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy) + AbortRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) { } private: @@ -674,8 +677,9 @@ class GetAllResponseHeadersRunnable final : nsCString& mResponseHeaders; public: - GetAllResponseHeadersRunnable(Proxy* aProxy, nsCString& aResponseHeaders) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy), + GetAllResponseHeadersRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + nsCString& aResponseHeaders) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mResponseHeaders(aResponseHeaders) { } @@ -696,9 +700,9 @@ class GetResponseHeaderRunnable final : public WorkerThreadProxySyncRunnable nsCString& mValue; public: - GetResponseHeaderRunnable(Proxy* aProxy, const nsACString& aHeader, - nsCString& aValue) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy), + GetResponseHeaderRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + const nsACString& aHeader, nsCString& aValue) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mHeader(aHeader), mValue(aValue) { } @@ -775,10 +779,9 @@ class SetRequestHeaderRunnable final : public WorkerThreadProxySyncRunnable nsCString mValue; public: - SetRequestHeaderRunnable(Proxy* aProxy, - const nsACString& aHeader, - const nsACString& aValue) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy), + SetRequestHeaderRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + const nsACString& aHeader, const nsACString& aValue) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mHeader(aHeader), mValue(aValue) { } @@ -799,8 +802,9 @@ class OverrideMimeTypeRunnable final : public WorkerThreadProxySyncRunnable nsString mMimeType; public: - OverrideMimeTypeRunnable(Proxy* aProxy, const nsAString& aMimeType) - : WorkerThreadProxySyncRunnable(GetCurrentThreadWorkerPrivate(), aProxy), + OverrideMimeTypeRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, + const nsAString& aMimeType) + : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mMimeType(aMimeType) { } @@ -1303,7 +1307,7 @@ EventRunnable::WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) state->mResponseURL = mResponseURL; XMLHttpRequestWorker* xhr = mProxy->mXMLHttpRequestPrivate; - xhr->UpdateState(aCx, *state.get(), mUseCachedArrayBufferResponse); + xhr->UpdateState(*state.get(), mUseCachedArrayBufferResponse); if (mType.EqualsASCII(sEventStrings[STRING_readystatechange])) { if (mReadyState == 4 && !mUploadEvent && !mProxy->mSeenLoadStart) { @@ -1539,27 +1543,24 @@ SendRunnable::RunOnMainThread(ErrorResult& aRv) } } -XMLHttpRequestWorker::XMLHttpRequestWorker() - : mResponseType(XMLHttpRequestResponseType::Text) - , mTimeout(0) - , mBackgroundRequest(false) - , mWithCredentials(false) - , mCanceled(false) - , mMozAnon(false) - , mMozSystem(false) +XMLHttpRequestWorker::XMLHttpRequestWorker(WorkerPrivate* aWorkerPrivate) +: WorkerHolder("XMLHttpRequestWorker"), mWorkerPrivate(aWorkerPrivate), + mResponseType(XMLHttpRequestResponseType::Text), mTimeout(0), + mRooted(false), mBackgroundRequest(false), mWithCredentials(false), + mCanceled(false), mMozAnon(false), mMozSystem(false) { - MOZ_ASSERT(IsCurrentThreadRunningWorker()); + mWorkerPrivate->AssertIsOnWorkerThread(); mozilla::HoldJSObjects(this); } XMLHttpRequestWorker::~XMLHttpRequestWorker() { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); ReleaseProxy(XHRIsGoingAway); - MOZ_ASSERT(!mWorkerRef); + MOZ_ASSERT(!mRooted); mozilla::DropJSObjects(this); } @@ -1594,12 +1595,12 @@ XMLHttpRequestWorker::Construct(const GlobalObject& aGlobal, const MozXMLHttpRequestParameters& aParams, ErrorResult& aRv) { - RefPtr xhr = new XMLHttpRequestWorker(); - JSContext* cx = aGlobal.Context(); WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(cx); MOZ_ASSERT(workerPrivate); + RefPtr xhr = new XMLHttpRequestWorker(workerPrivate); + if (workerPrivate->XHRParamsAllowed()) { if (aParams.mMozSystem) xhr->mMozAnon = true; @@ -1614,7 +1615,8 @@ XMLHttpRequestWorker::Construct(const GlobalObject& aGlobal, void XMLHttpRequestWorker::ReleaseProxy(ReleaseType aType) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + // Can't assert that we're on the worker thread here because mWorkerPrivate + // may be gone. if (mProxy) { if (aType == XHRIsGoingAway) { @@ -1624,10 +1626,7 @@ XMLHttpRequestWorker::ReleaseProxy(ReleaseType aType) new AsyncTeardownRunnable(mProxy); mProxy = nullptr; - WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); - MOZ_ASSERT(workerPrivate); - - if (NS_FAILED(workerPrivate->DispatchToMainThread(runnable.forget()))) { + if (NS_FAILED(mWorkerPrivate->DispatchToMainThread(runnable.forget()))) { NS_ERROR("Failed to dispatch teardown runnable!"); } } else { @@ -1639,7 +1638,8 @@ XMLHttpRequestWorker::ReleaseProxy(ReleaseType aType) } // We need to make a sync call here. - RefPtr runnable = new SyncTeardownRunnable(mProxy); + RefPtr runnable = + new SyncTeardownRunnable(mWorkerPrivate, mProxy); mProxy = nullptr; IgnoredErrorResult forAssertionsOnly; @@ -1650,43 +1650,31 @@ XMLHttpRequestWorker::ReleaseProxy(ReleaseType aType) } } -bool -XMLHttpRequestWorker::MaybePin() +void +XMLHttpRequestWorker::MaybePin(ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); - if (mWorkerRef) { - return true; + if (mRooted) { + return; } - WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); - MOZ_ASSERT(workerPrivate); - - RefPtr self = this; - mWorkerRef = - StrongWorkerRef::Create(workerPrivate, "XMLHttpRequestWorker", [self] { - self->mCanceled = true; - self->ReleaseProxy(WorkerIsGoingAway); - }); - - if (NS_WARN_IF(!mWorkerRef)) { - return false; + if (!HoldWorker(mWorkerPrivate, Canceling)) { + aRv.Throw(NS_ERROR_FAILURE); + return; } NS_ADDREF_THIS(); - return true; + + mRooted = true; } void XMLHttpRequestWorker::MaybeDispatchPrematureAbortEvents(ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); MOZ_ASSERT(mProxy); - // The worker can be closed during the dispatching of the following events. - // Let's keep the proxy alive. - RefPtr proxy = mProxy; - // Only send readystatechange event when state changed. bool isStateChanged = false; if ((mStateData.mReadyState == 1 && mStateData.mFlagSend) || @@ -1696,61 +1684,58 @@ XMLHttpRequestWorker::MaybeDispatchPrematureAbortEvents(ErrorResult& aRv) mStateData.mReadyState = 4; } - if (proxy->mSeenUploadLoadStart) { + if (mProxy->mSeenUploadLoadStart) { MOZ_ASSERT(mUpload); - DispatchPrematureAbortEvent(mUpload, proxy, NS_LITERAL_STRING("abort"), - true, aRv); - if (aRv.Failed()) { - return; - } - - DispatchPrematureAbortEvent(mUpload, proxy, NS_LITERAL_STRING("loadend"), - true, aRv); - if (aRv.Failed()) { - return; - } - - proxy->mSeenUploadLoadStart = false; - } - - if (proxy->mSeenLoadStart) { - if (isStateChanged) { - DispatchPrematureAbortEvent(this, proxy, - NS_LITERAL_STRING("readystatechange"), false, - aRv); - if (aRv.Failed()) { - return; - } - } - - DispatchPrematureAbortEvent(this, proxy, NS_LITERAL_STRING("abort"), false, + DispatchPrematureAbortEvent(mUpload, NS_LITERAL_STRING("abort"), true, aRv); if (aRv.Failed()) { return; } - DispatchPrematureAbortEvent(this, proxy, NS_LITERAL_STRING("loadend"), - false, aRv); + DispatchPrematureAbortEvent(mUpload, NS_LITERAL_STRING("loadend"), true, + aRv); if (aRv.Failed()) { return; } - proxy->mSeenLoadStart = false; + mProxy->mSeenUploadLoadStart = false; + } + + if (mProxy->mSeenLoadStart) { + if (isStateChanged) { + DispatchPrematureAbortEvent(this, NS_LITERAL_STRING("readystatechange"), + false, aRv); + if (aRv.Failed()) { + return; + } + } + + DispatchPrematureAbortEvent(this, NS_LITERAL_STRING("abort"), false, aRv); + if (aRv.Failed()) { + return; + } + + DispatchPrematureAbortEvent(this, NS_LITERAL_STRING("loadend"), false, + aRv); + if (aRv.Failed()) { + return; + } + + mProxy->mSeenLoadStart = false; } } void XMLHttpRequestWorker::DispatchPrematureAbortEvent(EventTarget* aTarget, - Proxy* aProxy, const nsAString& aEventType, bool aUploadTarget, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); MOZ_ASSERT(aTarget); - if (!aProxy) { + if (!mProxy) { aRv.Throw(NS_ERROR_FAILURE); return; } @@ -1765,14 +1750,14 @@ XMLHttpRequestWorker::DispatchPrematureAbortEvent(EventTarget* aTarget, init.mBubbles = false; init.mCancelable = false; if (aUploadTarget) { - init.mLengthComputable = aProxy->mLastUploadLengthComputable; - init.mLoaded = aProxy->mLastUploadLoaded; - init.mTotal = aProxy->mLastUploadTotal; + init.mLengthComputable = mProxy->mLastUploadLengthComputable; + init.mLoaded = mProxy->mLastUploadLoaded; + init.mTotal = mProxy->mLastUploadTotal; } else { - init.mLengthComputable = aProxy->mLastLengthComputable; - init.mLoaded = aProxy->mLastLoaded; - init.mTotal = aProxy->mLastTotal; + init.mLengthComputable = mProxy->mLastLengthComputable; + init.mLoaded = mProxy->mLastLoaded; + init.mTotal = mProxy->mLastTotal; } event = ProgressEvent::Constructor(aTarget, aEventType, init); } @@ -1791,11 +1776,13 @@ XMLHttpRequestWorker::DispatchPrematureAbortEvent(EventTarget* aTarget, void XMLHttpRequestWorker::Unpin() { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); - MOZ_ASSERT(mWorkerRef, "Mismatched calls to Unpin!"); + MOZ_ASSERT(mRooted, "Mismatched calls to Unpin!"); - mWorkerRef = nullptr; + ReleaseWorker(); + + mRooted = false; NS_RELEASE_THIS(); } @@ -1805,7 +1792,7 @@ XMLHttpRequestWorker::SendInternal(SendRunnable* aRunnable, ErrorResult& aRv) { MOZ_ASSERT(aRunnable); - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); // No send() calls when open is running. if (mProxy->mOpenCount) { @@ -1815,21 +1802,18 @@ XMLHttpRequestWorker::SendInternal(SendRunnable* aRunnable, bool hasUploadListeners = mUpload ? mUpload->HasListeners() : false; - if (NS_WARN_IF(!MaybePin())) { - // Worker is shutting down. Let's ignore this send request. + MaybePin(aRv); + if (aRv.Failed()) { return; } AutoUnpinXHR autoUnpin(this); Maybe autoSyncLoop; - WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); - MOZ_ASSERT(workerPrivate); - nsCOMPtr syncLoopTarget; bool isSyncXHR = mProxy->mIsSyncXHR; if (isSyncXHR) { - autoSyncLoop.emplace(workerPrivate, Terminating); + autoSyncLoop.emplace(mWorkerPrivate, Terminating); syncLoopTarget = autoSyncLoop->GetEventTarget(); if (!syncLoopTarget) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); @@ -1848,7 +1832,7 @@ XMLHttpRequestWorker::SendInternal(SendRunnable* aRunnable, if (aRv.Failed()) { // Dispatch() may have spun the event loop and we may have already unrooted. // If so we don't want autoUnpin to try again. - if (!mWorkerRef) { + if (!mRooted) { autoUnpin.Clear(); } return; @@ -1875,6 +1859,19 @@ XMLHttpRequestWorker::SendInternal(SendRunnable* aRunnable, } } +bool +XMLHttpRequestWorker::Notify(WorkerStatus aStatus) +{ + mWorkerPrivate->AssertIsOnWorkerThread(); + + if (aStatus >= Canceling && !mCanceled) { + mCanceled = true; + ReleaseProxy(WorkerIsGoingAway); + } + + return true; +} + void XMLHttpRequestWorker::Open(const nsACString& aMethod, const nsAString& aUrl, bool aAsync, @@ -1882,10 +1879,7 @@ XMLHttpRequestWorker::Open(const nsACString& aMethod, const Optional& aPassword, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); - - WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); - MOZ_ASSERT(workerPrivate); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -1894,19 +1888,19 @@ XMLHttpRequestWorker::Open(const nsACString& aMethod, if (mProxy) { MaybeDispatchPrematureAbortEvents(aRv); - if (aRv.Failed() || !mProxy) { + if (aRv.Failed()) { return; } } else { - mProxy = new Proxy(this, workerPrivate->GetClientInfo(), - workerPrivate->GetController(), mMozAnon, mMozSystem); + mProxy = new Proxy(this, mWorkerPrivate->GetClientInfo(), + mWorkerPrivate->GetController(), mMozAnon, mMozSystem); } mProxy->mOuterEventStreamId++; RefPtr runnable = - new OpenRunnable(workerPrivate, mProxy, aMethod, aUrl, aUser, aPassword, + new OpenRunnable(mWorkerPrivate, mProxy, aMethod, aUrl, aUser, aPassword, mBackgroundRequest, mWithCredentials, mTimeout, mResponseType); @@ -1934,7 +1928,7 @@ void XMLHttpRequestWorker::SetRequestHeader(const nsACString& aHeader, const nsACString& aValue, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -1947,14 +1941,14 @@ XMLHttpRequestWorker::SetRequestHeader(const nsACString& aHeader, } RefPtr runnable = - new SetRequestHeaderRunnable(mProxy, aHeader, aValue); + new SetRequestHeaderRunnable(mWorkerPrivate, mProxy, aHeader, aValue); runnable->Dispatch(Terminating, aRv); } void XMLHttpRequestWorker::SetTimeout(uint32_t aTimeout, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -1970,14 +1964,14 @@ XMLHttpRequestWorker::SetTimeout(uint32_t aTimeout, ErrorResult& aRv) } RefPtr runnable = - new SetTimeoutRunnable(mProxy, aTimeout); + new SetTimeoutRunnable(mWorkerPrivate, mProxy, aTimeout); runnable->Dispatch(Terminating, aRv); } void XMLHttpRequestWorker::SetWithCredentials(bool aWithCredentials, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -1993,7 +1987,7 @@ XMLHttpRequestWorker::SetWithCredentials(bool aWithCredentials, ErrorResult& aRv } RefPtr runnable = - new SetWithCredentialsRunnable(mProxy, aWithCredentials); + new SetWithCredentialsRunnable(mWorkerPrivate, mProxy, aWithCredentials); runnable->Dispatch(Terminating, aRv); } @@ -2001,7 +1995,7 @@ void XMLHttpRequestWorker::SetMozBackgroundRequest(bool aBackgroundRequest, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -2017,14 +2011,15 @@ XMLHttpRequestWorker::SetMozBackgroundRequest(bool aBackgroundRequest, } RefPtr runnable = - new SetBackgroundRequestRunnable(mProxy, aBackgroundRequest); + new SetBackgroundRequestRunnable(mWorkerPrivate, mProxy, + aBackgroundRequest); runnable->Dispatch(Terminating, aRv); } XMLHttpRequestUpload* XMLHttpRequestWorker::GetUpload(ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -2048,7 +2043,7 @@ XMLHttpRequestWorker::Send(JSContext* aCx, const Nullable& aData, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -2063,7 +2058,7 @@ XMLHttpRequestWorker::Send(JSContext* aCx, RefPtr sendRunnable; if (aData.IsNull()) { - sendRunnable = new SendRunnable(mProxy, VoidString()); + sendRunnable = new SendRunnable(mWorkerPrivate, mProxy, VoidString()); // Nothing to clone. } @@ -2089,7 +2084,7 @@ XMLHttpRequestWorker::Send(JSContext* aCx, return; } - sendRunnable = new SendRunnable(mProxy, EmptyString()); + sendRunnable = new SendRunnable(mWorkerPrivate, mProxy, EmptyString()); sendRunnable->Write(aCx, value, aRv); if (NS_WARN_IF(aRv.Failed())) { @@ -2098,7 +2093,7 @@ XMLHttpRequestWorker::Send(JSContext* aCx, } else if (aData.Value().IsArrayBuffer()) { - sendRunnable = new SendRunnable(mProxy, EmptyString()); + sendRunnable = new SendRunnable(mWorkerPrivate, mProxy, EmptyString()); JS::Rooted value(aCx); value.setObject(*aData.Value().GetAsArrayBuffer().Obj()); @@ -2119,7 +2114,7 @@ XMLHttpRequestWorker::Send(JSContext* aCx, return; } - sendRunnable = new SendRunnable(mProxy, EmptyString()); + sendRunnable = new SendRunnable(mWorkerPrivate, mProxy, EmptyString()); JS::Rooted value(aCx); value.setObject(*body.Obj()); @@ -2138,7 +2133,7 @@ XMLHttpRequestWorker::Send(JSContext* aCx, return; } - sendRunnable = new SendRunnable(mProxy, EmptyString()); + sendRunnable = new SendRunnable(mWorkerPrivate, mProxy, EmptyString()); sendRunnable->Write(aCx, value, aRv); if (NS_WARN_IF(aRv.Failed())) { @@ -2154,7 +2149,7 @@ XMLHttpRequestWorker::Send(JSContext* aCx, return; } - sendRunnable = new SendRunnable(mProxy, EmptyString()); + sendRunnable = new SendRunnable(mWorkerPrivate, mProxy, EmptyString()); sendRunnable->Write(aCx, value, aRv); if (NS_WARN_IF(aRv.Failed())) { @@ -2163,7 +2158,8 @@ XMLHttpRequestWorker::Send(JSContext* aCx, } else if (aData.Value().IsUSVString()) { - sendRunnable = new SendRunnable(mProxy, aData.Value().GetAsUSVString()); + sendRunnable = new SendRunnable(mWorkerPrivate, mProxy, + aData.Value().GetAsUSVString()); // Nothing to clone. } @@ -2174,7 +2170,7 @@ XMLHttpRequestWorker::Send(JSContext* aCx, void XMLHttpRequestWorker::Abort(ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -2207,13 +2203,9 @@ XMLHttpRequestWorker::Abort(ErrorResult& aRv) mStateData.mReadyState = 0; } - if (!mProxy) { - return; - } - mProxy->mOuterEventStreamId++; - RefPtr runnable = new AbortRunnable(mProxy); + RefPtr runnable = new AbortRunnable(mWorkerPrivate, mProxy); runnable->Dispatch(Terminating, aRv); } @@ -2221,7 +2213,7 @@ void XMLHttpRequestWorker::GetResponseHeader(const nsACString& aHeader, nsACString& aResponseHeader, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -2235,7 +2227,8 @@ XMLHttpRequestWorker::GetResponseHeader(const nsACString& aHeader, nsCString responseHeader; RefPtr runnable = - new GetResponseHeaderRunnable(mProxy, aHeader, responseHeader); + new GetResponseHeaderRunnable(mWorkerPrivate, mProxy, aHeader, + responseHeader); runnable->Dispatch(Terminating, aRv); if (aRv.Failed()) { return; @@ -2247,7 +2240,7 @@ void XMLHttpRequestWorker::GetAllResponseHeaders(nsACString& aResponseHeaders, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -2261,7 +2254,7 @@ XMLHttpRequestWorker::GetAllResponseHeaders(nsACString& aResponseHeaders, nsCString responseHeaders; RefPtr runnable = - new GetAllResponseHeadersRunnable(mProxy, responseHeaders); + new GetAllResponseHeadersRunnable(mWorkerPrivate, mProxy, responseHeaders); runnable->Dispatch(Terminating, aRv); if (aRv.Failed()) { return; @@ -2273,7 +2266,7 @@ XMLHttpRequestWorker::GetAllResponseHeaders(nsACString& aResponseHeaders, void XMLHttpRequestWorker::OverrideMimeType(const nsAString& aMimeType, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -2293,7 +2286,7 @@ XMLHttpRequestWorker::OverrideMimeType(const nsAString& aMimeType, ErrorResult& } RefPtr runnable = - new OverrideMimeTypeRunnable(mProxy, aMimeType); + new OverrideMimeTypeRunnable(mWorkerPrivate, mProxy, aMimeType); runnable->Dispatch(Terminating, aRv); } @@ -2301,7 +2294,7 @@ void XMLHttpRequestWorker::SetResponseType(XMLHttpRequestResponseType aResponseType, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); + mWorkerPrivate->AssertIsOnWorkerThread(); if (mCanceled) { aRv.ThrowUncatchableException(); @@ -2329,7 +2322,7 @@ XMLHttpRequestWorker::SetResponseType(XMLHttpRequestResponseType aResponseType, } RefPtr runnable = - new SetResponseTypeRunnable(mProxy, aResponseType); + new SetResponseTypeRunnable(mWorkerPrivate, mProxy, aResponseType); runnable->Dispatch(Terminating, aRv); if (aRv.Failed()) { return; @@ -2339,23 +2332,23 @@ XMLHttpRequestWorker::SetResponseType(XMLHttpRequestResponseType aResponseType, } void -XMLHttpRequestWorker::GetResponse(JSContext* aCx, +XMLHttpRequestWorker::GetResponse(JSContext* /* unused */, JS::MutableHandle aResponse, ErrorResult& aRv) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); - if (NS_SUCCEEDED(mStateData.mResponseTextResult) && mStateData.mResponse.isUndefined()) { MOZ_ASSERT(NS_SUCCEEDED(mStateData.mResponseResult)); if (mStateData.mResponseText.IsEmpty()) { - mStateData.mResponse = JS_GetEmptyStringValue(aCx); + mStateData.mResponse = + JS_GetEmptyStringValue(mWorkerPrivate->GetJSContext()); } else { XMLHttpRequestStringSnapshotReaderHelper helper(mStateData.mResponseText); JSString* str = - JS_NewUCStringCopyN(aCx, helper.Buffer(), helper.Length()); + JS_NewUCStringCopyN(mWorkerPrivate->GetJSContext(), + helper.Buffer(), helper.Length()); if (!str) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); @@ -2385,17 +2378,15 @@ XMLHttpRequestWorker::GetResponseText(DOMString& aResponseText, ErrorResult& aRv } void -XMLHttpRequestWorker::UpdateState(JSContext* aCx, - const StateData& aStateData, +XMLHttpRequestWorker::UpdateState(const StateData& aStateData, bool aUseCachedArrayBufferResponse) { - NS_ASSERT_OWNINGTHREAD(XMLHttpRequestWorker); - if (aUseCachedArrayBufferResponse) { MOZ_ASSERT(mStateData.mResponse.isObject() && JS_IsArrayBufferObject(&mStateData.mResponse.toObject())); - JS::Rooted response(aCx, mStateData.mResponse); + JS::Rooted response(mWorkerPrivate->GetJSContext(), + mStateData.mResponse); mStateData = aStateData; mStateData.mResponse = response; } diff --git a/dom/xhr/XMLHttpRequestWorker.h b/dom/xhr/XMLHttpRequestWorker.h index 357cef65b843..1913e308d597 100644 --- a/dom/xhr/XMLHttpRequestWorker.h +++ b/dom/xhr/XMLHttpRequestWorker.h @@ -10,6 +10,7 @@ #include "XMLHttpRequest.h" #include "XMLHttpRequestString.h" #include "mozilla/dom/TypedArray.h" +#include "mozilla/dom/WorkerHolder.h" namespace mozilla { namespace dom { @@ -17,9 +18,10 @@ namespace dom { class Proxy; class SendRunnable; class DOMString; -class StrongWorkerRef; +class WorkerPrivate; -class XMLHttpRequestWorker final : public XMLHttpRequest +class XMLHttpRequestWorker final : public XMLHttpRequest, + public WorkerHolder { public: struct StateData @@ -46,13 +48,14 @@ public: private: RefPtr mUpload; - RefPtr mWorkerRef; + WorkerPrivate* mWorkerPrivate; RefPtr mProxy; XMLHttpRequestResponseType mResponseType; StateData mStateData; uint32_t mTimeout; + bool mRooted; bool mBackgroundRequest; bool mWithCredentials; bool mCanceled; @@ -74,6 +77,9 @@ public: void Unpin(); + bool + Notify(WorkerStatus aStatus) override; + virtual uint16_t ReadyState() const override { @@ -245,8 +251,7 @@ public: } void - UpdateState(JSContext* aCx, const StateData& aStateData, - bool aUseCachedArrayBufferResponse); + UpdateState(const StateData& aStateData, bool aUseCachedArrayBufferResponse); void NullResponseText() @@ -273,11 +278,11 @@ public: bool SendInProgress() const { - return !!mWorkerRef; + return mRooted; } private: - XMLHttpRequestWorker(); + explicit XMLHttpRequestWorker(WorkerPrivate* aWorkerPrivate); ~XMLHttpRequestWorker(); enum ReleaseType { Default, XHRIsGoingAway, WorkerIsGoingAway }; @@ -285,14 +290,14 @@ private: void ReleaseProxy(ReleaseType aType = Default); - bool - MaybePin(); + void + MaybePin(ErrorResult& aRv); void MaybeDispatchPrematureAbortEvents(ErrorResult& aRv); void - DispatchPrematureAbortEvent(EventTarget* aTarget, Proxy* aProxy, + DispatchPrematureAbortEvent(EventTarget* aTarget, const nsAString& aEventType, bool aUploadTarget, ErrorResult& aRv); diff --git a/testing/web-platform/meta/MANIFEST.json b/testing/web-platform/meta/MANIFEST.json index 58235631a9b1..36c838fe5b5f 100644 --- a/testing/web-platform/meta/MANIFEST.json +++ b/testing/web-platform/meta/MANIFEST.json @@ -366460,12 +366460,6 @@ {} ] ], - "xhr/xmlhttprequest-closing-worker.html": [ - [ - "/xhr/xmlhttprequest-closing-worker.html", - {} - ] - ], "xhr/xmlhttprequest-eventtarget.htm": [ [ "/xhr/xmlhttprequest-eventtarget.htm", @@ -601515,10 +601509,6 @@ "a67d1876d6245fb94d60a937b633c87c51a04d21", "testharness" ], - "xhr/xmlhttprequest-closing-worker.html": [ - "2e12b49aca2dc3908837b6b419c92cb890e60e3f", - "testharness" - ], "xhr/xmlhttprequest-eventtarget.htm": [ "40c886f79399108db3ded8a23848905dcf9e0862", "testharness"