mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-07 09:54:42 +00:00
Bug 1908947 - Add WorkerPrivate::GetTopLevelWorker() r=asuth
Differential Revision: https://phabricator.services.mozilla.com/D217139
This commit is contained in:
parent
c3216db173
commit
98b0f1c3d6
@ -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 =
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user