Bug 1908729 - Part 1: Replace nsIObserver with GlobalObservers in BodyConsumer r=smaug
Differential Revision: https://phabricator.services.mozilla.com/D217127
This commit is contained in:
@@ -313,21 +313,8 @@ NS_IMPL_ISUPPORTS(ConsumeBodyDoneObserver, nsIStreamLoaderObserver)
|
||||
|
||||
workerRef = new ThreadSafeWorkerRef(strongWorkerRef);
|
||||
} else {
|
||||
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
||||
if (NS_WARN_IF(!os)) {
|
||||
aRv.Throw(NS_ERROR_FAILURE);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
aRv = os->AddObserver(consumer, DOM_WINDOW_DESTROYED_TOPIC, true);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
aRv = os->AddObserver(consumer, DOM_WINDOW_FROZEN_TOPIC, true);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
consumer->GlobalTeardownObserver::BindToOwner(aGlobal);
|
||||
consumer->GlobalFreezeObserver::BindToOwner(aGlobal);
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIRunnable> r = new BeginConsumeBodyRunnable(consumer, workerRef);
|
||||
@@ -347,11 +334,8 @@ void BodyConsumer::ReleaseObject() {
|
||||
AssertIsOnTargetThread();
|
||||
|
||||
if (NS_IsMainThread()) {
|
||||
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
||||
if (os) {
|
||||
os->RemoveObserver(this, DOM_WINDOW_DESTROYED_TOPIC);
|
||||
os->RemoveObserver(this, DOM_WINDOW_FROZEN_TOPIC);
|
||||
}
|
||||
GlobalTeardownObserver::DisconnectFromOwner();
|
||||
DisconnectFreezeObserver();
|
||||
}
|
||||
|
||||
mGlobal = nullptr;
|
||||
@@ -683,10 +667,7 @@ void BodyConsumer::ContinueConsumeBody(nsresult aStatus, uint32_t aResultLength,
|
||||
} else {
|
||||
localPromise->MaybeReject(NS_ERROR_DOM_ABORT_ERR);
|
||||
}
|
||||
}
|
||||
|
||||
// Don't warn here since we warned above.
|
||||
if (NS_FAILED(aStatus)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -815,27 +796,25 @@ void BodyConsumer::ShutDownMainThreadConsuming() {
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP BodyConsumer::Observe(nsISupports* aSubject, const char* aTopic,
|
||||
const char16_t* aData) {
|
||||
void BodyConsumer::MaybeAbortConsumption() {
|
||||
AssertIsOnMainThread();
|
||||
|
||||
MOZ_ASSERT((strcmp(aTopic, DOM_WINDOW_FROZEN_TOPIC) == 0) ||
|
||||
(strcmp(aTopic, DOM_WINDOW_DESTROYED_TOPIC) == 0));
|
||||
|
||||
nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(mGlobal);
|
||||
if (SameCOMIdentity(aSubject, window)) {
|
||||
ContinueConsumeBody(NS_BINDING_ABORTED, 0, nullptr);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void BodyConsumer::RunAbortAlgorithm() {
|
||||
AssertIsOnTargetThread();
|
||||
ShutDownMainThreadConsuming();
|
||||
ContinueConsumeBody(NS_ERROR_DOM_ABORT_ERR, 0, nullptr);
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(BodyConsumer, nsIObserver, nsISupportsWeakReference)
|
||||
NS_IMPL_ADDREF(BodyConsumer)
|
||||
NS_IMPL_RELEASE(BodyConsumer)
|
||||
NS_INTERFACE_TABLE_HEAD(BodyConsumer)
|
||||
NS_INTERFACE_TABLE_BEGIN
|
||||
NS_INTERFACE_TABLE_ENTRY_AMBIGUOUS(BodyConsumer, nsISupports,
|
||||
GlobalTeardownObserver)
|
||||
NS_INTERFACE_TABLE_END
|
||||
NS_INTERFACE_TABLE_TAIL
|
||||
|
||||
} // namespace mozilla::dom
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
#ifndef mozilla_dom_BodyConsumer_h
|
||||
#define mozilla_dom_BodyConsumer_h
|
||||
|
||||
#include "mozilla/dom/AbortSignal.h"
|
||||
#include "mozilla/GlobalTeardownObserver.h"
|
||||
#include "mozilla/GlobalFreezeObserver.h"
|
||||
#include "mozilla/dom/AbortFollower.h"
|
||||
#include "mozilla/dom/MutableBlobStorage.h"
|
||||
#include "nsIInputStreamPump.h"
|
||||
#include "nsIObserver.h"
|
||||
#include "nsWeakReference.h"
|
||||
|
||||
class nsIThread;
|
||||
|
||||
@@ -22,12 +22,11 @@ class ThreadSafeWorkerRef;
|
||||
|
||||
// In order to keep alive the object all the time, we use a ThreadSafeWorkerRef,
|
||||
// if created on workers.
|
||||
class BodyConsumer final : public nsIObserver,
|
||||
public nsSupportsWeakReference,
|
||||
public AbortFollower {
|
||||
class BodyConsumer final : public AbortFollower,
|
||||
public GlobalTeardownObserver,
|
||||
public GlobalFreezeObserver {
|
||||
public:
|
||||
NS_DECL_THREADSAFE_ISUPPORTS
|
||||
NS_DECL_NSIOBSERVER
|
||||
|
||||
enum class ConsumeType {
|
||||
ArrayBuffer,
|
||||
@@ -76,8 +75,8 @@ class BodyConsumer final : public nsIObserver,
|
||||
void OnBlobResult(BlobImpl* aBlobImpl,
|
||||
ThreadSafeWorkerRef* aWorkerRef = nullptr);
|
||||
|
||||
void ContinueConsumeBody(nsresult aStatus, uint32_t aLength, uint8_t* aResult,
|
||||
bool aShuttingDown = false);
|
||||
void ContinueConsumeBody(nsresult aStatus, uint32_t aResultLength,
|
||||
uint8_t* aResult, bool aShuttingDown = false);
|
||||
|
||||
void ContinueConsumeBlobBody(BlobImpl* aBlobImpl, bool aShuttingDown = false);
|
||||
|
||||
@@ -109,6 +108,17 @@ class BodyConsumer final : public nsIObserver,
|
||||
|
||||
void AssertIsOnTargetThread() const;
|
||||
|
||||
void MaybeAbortConsumption();
|
||||
|
||||
void DisconnectFromOwner() override {
|
||||
MaybeAbortConsumption();
|
||||
GlobalTeardownObserver::DisconnectFromOwner();
|
||||
}
|
||||
void FrozenCallback(nsIGlobalObject* aGlobal) override {
|
||||
// XXX: But we should not abort on window freeze, see bug 1910124
|
||||
MaybeAbortConsumption();
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIThread> mTargetThread;
|
||||
nsCOMPtr<nsISerialEventTarget> mMainThreadEventTarget;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user