зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1445587 - Port Fetch to WorkerRef - part 4 - Fetch Request, r=smaug
This commit is contained in:
Родитель
2035842eaa
Коммит
446bd86ffe
|
@ -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");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче