summaryrefslogtreecommitdiffstats
path: root/dom/xhr
diff options
context:
space:
mode:
authorjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-07-05 13:04:44 +0200
committerjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-07-05 13:04:44 +0200
commita80267e9e88b3dcebf7f8f1f6f10931a99ddf2ca (patch)
tree24d69034f60ed1f6bf79cccfbbe05f10c26238ff /dom/xhr
parentc3916ca1a0164dcb7742360a43d7ab36a80907fc (diff)
downloadUXP-a80267e9e88b3dcebf7f8f1f6f10931a99ddf2ca.tar
UXP-a80267e9e88b3dcebf7f8f1f6f10931a99ddf2ca.tar.gz
UXP-a80267e9e88b3dcebf7f8f1f6f10931a99ddf2ca.tar.lz
UXP-a80267e9e88b3dcebf7f8f1f6f10931a99ddf2ca.tar.xz
UXP-a80267e9e88b3dcebf7f8f1f6f10931a99ddf2ca.zip
Bug 604026 - Sync event loops in workers should be created only if compatible with the worker shutdown status
Diffstat (limited to 'dom/xhr')
-rw-r--r--dom/xhr/XMLHttpRequestWorker.cpp37
1 files changed, 21 insertions, 16 deletions
diff --git a/dom/xhr/XMLHttpRequestWorker.cpp b/dom/xhr/XMLHttpRequestWorker.cpp
index e7193a279..b5f853a50 100644
--- a/dom/xhr/XMLHttpRequestWorker.cpp
+++ b/dom/xhr/XMLHttpRequestWorker.cpp
@@ -208,9 +208,9 @@ public:
}
void
- Dispatch(ErrorResult& aRv)
+ Dispatch(Status aFailStatus, ErrorResult& aRv)
{
- WorkerMainThreadRunnable::Dispatch(aRv);
+ WorkerMainThreadRunnable::Dispatch(aFailStatus, aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
@@ -1634,7 +1634,8 @@ XMLHttpRequestWorker::ReleaseProxy(ReleaseType aType)
mProxy = nullptr;
ErrorResult forAssertionsOnly;
- runnable->Dispatch(forAssertionsOnly);
+ // This runnable _must_ be executed.
+ runnable->Dispatch(Killing, forAssertionsOnly);
if (forAssertionsOnly.Failed()) {
NS_ERROR("Failed to dispatch teardown runnable!");
}
@@ -1804,8 +1805,12 @@ XMLHttpRequestWorker::SendInternal(SendRunnable* aRunnable,
nsCOMPtr<nsIEventTarget> syncLoopTarget;
bool isSyncXHR = mProxy->mIsSyncXHR;
if (isSyncXHR) {
- autoSyncLoop.emplace(mWorkerPrivate);
- syncLoopTarget = autoSyncLoop->EventTarget();
+ autoSyncLoop.emplace(mWorkerPrivate, Terminating);
+ syncLoopTarget = autoSyncLoop->GetEventTarget();
+ if (!syncLoopTarget) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
}
mProxy->mOuterChannelId++;
@@ -1815,7 +1820,7 @@ XMLHttpRequestWorker::SendInternal(SendRunnable* aRunnable,
mStateData.mFlagSend = true;
- aRunnable->Dispatch(aRv);
+ aRunnable->Dispatch(Terminating, aRv);
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.
@@ -1889,7 +1894,7 @@ XMLHttpRequestWorker::Open(const nsACString& aMethod,
mTimeout, mResponseType);
++mProxy->mOpenCount;
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
if (aRv.Failed()) {
if (mProxy && !--mProxy->mOpenCount) {
ReleaseProxy();
@@ -1926,7 +1931,7 @@ XMLHttpRequestWorker::SetRequestHeader(const nsACString& aHeader,
RefPtr<SetRequestHeaderRunnable> runnable =
new SetRequestHeaderRunnable(mWorkerPrivate, mProxy, aHeader, aValue);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
}
void
@@ -1949,7 +1954,7 @@ XMLHttpRequestWorker::SetTimeout(uint32_t aTimeout, ErrorResult& aRv)
RefPtr<SetTimeoutRunnable> runnable =
new SetTimeoutRunnable(mWorkerPrivate, mProxy, aTimeout);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
}
void
@@ -1972,7 +1977,7 @@ XMLHttpRequestWorker::SetWithCredentials(bool aWithCredentials, ErrorResult& aRv
RefPtr<SetWithCredentialsRunnable> runnable =
new SetWithCredentialsRunnable(mWorkerPrivate, mProxy, aWithCredentials);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
}
void
@@ -1997,7 +2002,7 @@ XMLHttpRequestWorker::SetMozBackgroundRequest(bool aBackgroundRequest,
RefPtr<SetBackgroundRequestRunnable> runnable =
new SetBackgroundRequestRunnable(mWorkerPrivate, mProxy,
aBackgroundRequest);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
}
XMLHttpRequestUpload*
@@ -2265,7 +2270,7 @@ XMLHttpRequestWorker::Abort(ErrorResult& aRv)
mProxy->mOuterEventStreamId++;
RefPtr<AbortRunnable> runnable = new AbortRunnable(mWorkerPrivate, mProxy);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
}
void
@@ -2288,7 +2293,7 @@ XMLHttpRequestWorker::GetResponseHeader(const nsACString& aHeader,
RefPtr<GetResponseHeaderRunnable> runnable =
new GetResponseHeaderRunnable(mWorkerPrivate, mProxy, aHeader,
responseHeader);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
if (aRv.Failed()) {
return;
}
@@ -2314,7 +2319,7 @@ XMLHttpRequestWorker::GetAllResponseHeaders(nsACString& aResponseHeaders,
nsCString responseHeaders;
RefPtr<GetAllResponseHeadersRunnable> runnable =
new GetAllResponseHeadersRunnable(mWorkerPrivate, mProxy, responseHeaders);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
if (aRv.Failed()) {
return;
}
@@ -2346,7 +2351,7 @@ XMLHttpRequestWorker::OverrideMimeType(const nsAString& aMimeType, ErrorResult&
RefPtr<OverrideMimeTypeRunnable> runnable =
new OverrideMimeTypeRunnable(mWorkerPrivate, mProxy, aMimeType);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
}
void
@@ -2382,7 +2387,7 @@ XMLHttpRequestWorker::SetResponseType(XMLHttpRequestResponseType aResponseType,
RefPtr<SetResponseTypeRunnable> runnable =
new SetResponseTypeRunnable(mWorkerPrivate, mProxy, aResponseType);
- runnable->Dispatch(aRv);
+ runnable->Dispatch(Terminating, aRv);
if (aRv.Failed()) {
return;
}