Bug 1908947 - Add WorkerPrivate::GetTopLevelWorker() r=asuth

Differential Revision: https://phabricator.services.mozilla.com/D217139
This commit is contained in:
Kagami Sascha Rosylight 2024-07-23 13:46:45 +00:00
parent c3216db173
commit 98b0f1c3d6
7 changed files with 22 additions and 51 deletions

View File

@ -502,10 +502,7 @@ class InitRunnable final : public WorkerMainThreadRunnable {
bool MainThreadRun() override {
// Get principal from worker's owner document or from worker.
MOZ_ASSERT(mWorkerRef);
WorkerPrivate* wp = mWorkerRef->Private();
while (wp->GetParent()) {
wp = wp->GetParent();
}
WorkerPrivate* wp = mWorkerRef->Private()->GetTopLevelWorker();
nsPIDOMWindowInner* window = wp->GetWindow();
Document* doc = window ? window->GetExtantDoc() : nullptr;
nsCOMPtr<nsIPrincipal> principal =

View File

@ -4099,13 +4099,7 @@ class DeprecationWarningRunnable final
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aWorkerPrivate);
// Walk up to our containing page
WorkerPrivate* wp = aWorkerPrivate;
while (wp->GetParent()) {
wp = wp->GetParent();
}
nsPIDOMWindowInner* window = wp->GetWindow();
nsPIDOMWindowInner* window = aWorkerPrivate->GetAncestorWindow();
if (window && window->GetExtantDoc()) {
window->GetExtantDoc()->WarnOnceAbout(mOperation);
}

View File

@ -569,10 +569,7 @@ class ConsoleWorkerRunnable : public WorkerProxyToMainThreadRunnable,
AssertIsOnMainThread();
// Walk up to our containing page
WorkerPrivate* wp = aWorkerPrivate;
while (wp->GetParent()) {
wp = wp->GetParent();
}
WorkerPrivate* wp = aWorkerPrivate->GetTopLevelWorker();
nsCOMPtr<nsPIDOMWindowInner> window = wp->GetWindow();
if (!window) {
@ -608,10 +605,7 @@ class ConsoleWorkerRunnable : public WorkerProxyToMainThreadRunnable,
MOZ_ASSERT(aWorkerPrivate);
AssertIsOnMainThread();
WorkerPrivate* wp = aWorkerPrivate;
while (wp->GetParent()) {
wp = wp->GetParent();
}
WorkerPrivate* wp = aWorkerPrivate->GetTopLevelWorker();
MOZ_ASSERT(!wp->GetWindow());

View File

@ -1189,12 +1189,7 @@ WorkerNotificationObserver::Observe(nsISupports* aSubject, const char* aTopic,
if (!strcmp("alertclickcallback", aTopic)) {
nsPIDOMWindowInner* window = nullptr;
if (!notification->mWorkerPrivate->IsServiceWorker()) {
WorkerPrivate* top = notification->mWorkerPrivate;
while (top->GetParent()) {
top = top->GetParent();
}
window = top->GetWindow();
window = notification->mWorkerPrivate->GetAncestorWindow();
if (NS_WARN_IF(!window || !window->IsCurrentInnerWindow())) {
// Window has been closed, this observer is not valid anymore
return NS_ERROR_FAILURE;

View File

@ -1083,11 +1083,7 @@ class WebSocketMainThreadRunnable : public WorkerMainThreadRunnable {
MOZ_ASSERT(mWorkerRef);
// Walk up to our containing page
WorkerPrivate* wp = mWorkerRef->Private();
;
while (wp->GetParent()) {
wp = wp->GetParent();
}
WorkerPrivate* wp = mWorkerRef->Private()->GetTopLevelWorker();
nsPIDOMWindowInner* window = wp->GetWindow();
if (window) {
@ -2740,13 +2736,7 @@ WebSocketImpl::GetLoadGroup(nsILoadGroup** aLoadGroup) {
MOZ_ASSERT(mWorkerRef);
// Walk up to our containing page
WorkerPrivate* wp = mWorkerRef->Private();
while (wp->GetParent()) {
wp = wp->GetParent();
}
nsPIDOMWindowInner* window = wp->GetWindow();
nsPIDOMWindowInner* window = mWorkerRef->Private()->GetAncestorWindow();
if (!window) {
return NS_OK;
}

View File

@ -1368,20 +1368,11 @@ Document* WorkerPrivate::GetDocument() const {
nsPIDOMWindowInner* WorkerPrivate::GetAncestorWindow() const {
AssertIsOnMainThread();
if (mLoadInfo.mWindow) {
return mLoadInfo.mWindow;
}
// if we don't have a document, we should query the document
// from the parent in case of a nested worker
WorkerPrivate* parent = mParent;
while (parent) {
if (parent->mLoadInfo.mWindow) {
return parent->mLoadInfo.mWindow;
}
parent = parent->GetParent();
}
// couldn't query a window, give up and return nullptr
return nullptr;
// We should query the window from the top level worker in case of a nested
// worker, as only the top level one can have a window.
WorkerPrivate* top = GetTopLevelWorker();
return top->GetWindow();
}
class EvictFromBFCacheRunnable final : public WorkerProxyToMainThreadRunnable {

View File

@ -719,6 +719,16 @@ class WorkerPrivate final
// We would like to have stronger type-system annotated/enforced handling.
WorkerPrivate* GetParent() const { return mParent; }
// Returns the top level worker. It can be the current worker if it's the top
// level one.
WorkerPrivate* GetTopLevelWorker() const {
WorkerPrivate const* wp = this;
while (wp->GetParent()) {
wp = wp->GetParent();
}
return const_cast<WorkerPrivate*>(wp);
}
bool IsFrozen() const {
AssertIsOnParentThread();
return mParentFrozen;