Bug 1445587 - Port Fetch to WorkerRef - part 4 - Fetch Request, r=smaug

This commit is contained in:
Andrea Marchesini 2018-03-16 16:52:29 +01:00
Родитель 2035842eaa
Коммит 446bd86ffe
1 изменённых файлов: 12 добавлений и 45 удалений

Просмотреть файл

@ -46,6 +46,7 @@
#include "mozilla/dom/WorkerCommon.h" #include "mozilla/dom/WorkerCommon.h"
#include "mozilla/dom/WorkerPrivate.h" #include "mozilla/dom/WorkerPrivate.h"
#include "mozilla/dom/WorkerRef.h"
#include "mozilla/dom/WorkerRunnable.h" #include "mozilla/dom/WorkerRunnable.h"
#include "mozilla/dom/WorkerScope.h" #include "mozilla/dom/WorkerScope.h"
@ -158,22 +159,6 @@ private:
} }
}; };
class WorkerFetchResolver;
class WorkerNotifier final : public WorkerHolder
{
RefPtr<WorkerFetchResolver> mResolver;
public:
explicit WorkerNotifier(WorkerFetchResolver* aResolver)
: WorkerHolder("WorkerNotifier", AllowIdleShutdownStart)
, mResolver(aResolver)
{}
bool
Notify(WorkerStatus aStatus) override;
};
class WorkerFetchResolver final : public FetchDriverObserver class WorkerFetchResolver final : public FetchDriverObserver
{ {
// Thread-safe: // Thread-safe:
@ -182,7 +167,7 @@ class WorkerFetchResolver final : public FetchDriverObserver
// Touched only on the worker thread. // Touched only on the worker thread.
RefPtr<FetchObserver> mFetchObserver; RefPtr<FetchObserver> mFetchObserver;
UniquePtr<WorkerHolder> mWorkerHolder; RefPtr<WeakWorkerRef> mWorkerRef;
public: public:
// Returns null if worker is shutting down. // Returns null if worker is shutting down.
@ -207,10 +192,16 @@ public:
RefPtr<WorkerFetchResolver> r = RefPtr<WorkerFetchResolver> r =
new WorkerFetchResolver(proxy, signalProxy, aObserver); new WorkerFetchResolver(proxy, signalProxy, aObserver);
if (NS_WARN_IF(!r->HoldWorker(aWorkerPrivate))) { RefPtr<WeakWorkerRef> workerRef =
WeakWorkerRef::Create(aWorkerPrivate, [r]() {
r->Shutdown(r->mWorkerRef->GetPrivate());
});
if (NS_WARN_IF(!workerRef)) {
return nullptr; return nullptr;
} }
r->mWorkerRef = Move(workerRef);
return r.forget(); return r.forget();
} }
@ -289,7 +280,7 @@ public:
mSignalProxy->Shutdown(); mSignalProxy->Shutdown();
} }
mWorkerHolder = nullptr; mWorkerRef = nullptr;
} }
private: private:
@ -309,18 +300,6 @@ private:
virtual void virtual void
FlushConsoleReport() override; FlushConsoleReport() override;
bool
HoldWorker(WorkerPrivate* aWorkerPrivate)
{
UniquePtr<WorkerNotifier> wn(new WorkerNotifier(this));
if (NS_WARN_IF(!wn->HoldWorker(aWorkerPrivate, Canceling))) {
return false;
}
mWorkerHolder = Move(wn);
return true;
}
}; };
class MainThreadFetchResolver final : public FetchDriverObserver class MainThreadFetchResolver final : public FetchDriverObserver
@ -551,7 +530,7 @@ FetchRequest(nsIGlobalObject* aGlobal, const RequestOrUSVString& aInput,
RefPtr<WorkerFetchResolver> resolver = RefPtr<WorkerFetchResolver> resolver =
WorkerFetchResolver::Create(worker, p, signal, observer); WorkerFetchResolver::Create(worker, p, signal, observer);
if (!resolver) { if (!resolver) {
NS_WARNING("Could not add WorkerFetchResolver workerHolder to worker"); NS_WARNING("Could not keep the worker alive.");
aRv.Throw(NS_ERROR_DOM_ABORT_ERR); aRv.Throw(NS_ERROR_DOM_ABORT_ERR);
return nullptr; return nullptr;
} }
@ -776,18 +755,6 @@ public:
// Control runnable cancel already calls Run(). // Control runnable cancel already calls Run().
}; };
bool
WorkerNotifier::Notify(WorkerStatus aStatus)
{
if (mResolver) {
// This will nullify this object.
// No additional operation after this line!
mResolver->Shutdown(mWorkerPrivate);
}
return true;
}
void void
WorkerFetchResolver::OnResponseAvailableInternal(InternalResponse* aResponse) WorkerFetchResolver::OnResponseAvailableInternal(InternalResponse* aResponse)
{ {
@ -850,7 +817,7 @@ WorkerFetchResolver::OnResponseEnd(FetchDriverObserver::EndReason aReason)
new WorkerFetchResponseEndControlRunnable(mPromiseProxy->GetWorkerPrivate(), new WorkerFetchResponseEndControlRunnable(mPromiseProxy->GetWorkerPrivate(),
this); this);
// This can fail if the worker thread is canceled or killed causing // This can fail if the worker thread is canceled or killed causing
// the PromiseWorkerProxy to give up its WorkerHolder immediately, // the PromiseWorkerProxy to give up its WorkerRef immediately,
// allowing the worker thread to become Dead. // allowing the worker thread to become Dead.
if (!cr->Dispatch()) { if (!cr->Dispatch()) {
NS_WARNING("Failed to dispatch WorkerFetchResponseEndControlRunnable"); NS_WARNING("Failed to dispatch WorkerFetchResponseEndControlRunnable");