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:
Kagami Sascha Rosylight
2024-07-30 13:53:59 +00:00
parent e3af661383
commit 1761374416
2 changed files with 33 additions and 44 deletions

View File

@@ -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,19 +796,10 @@ 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;
ContinueConsumeBody(NS_BINDING_ABORTED, 0, nullptr);
}
void BodyConsumer::RunAbortAlgorithm() {
@@ -836,6 +808,13 @@ void BodyConsumer::RunAbortAlgorithm() {
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

View File

@@ -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;