diff --git a/dom/workers/ServiceWorkerManager.cpp b/dom/workers/ServiceWorkerManager.cpp index 0bea0223f8..7f70c9ee10 100644 --- a/dom/workers/ServiceWorkerManager.cpp +++ b/dom/workers/ServiceWorkerManager.cpp @@ -3082,6 +3082,8 @@ void ServiceWorkerManager::FireControllerChange(ServiceWorkerRegistrationInfo* aRegistration) { AssertIsOnMainThread(); + + AutoTArray, 16> documents; for (auto iter = mControlledDocuments.Iter(); !iter.Done(); iter.Next()) { if (iter.UserData() != aRegistration) { continue; @@ -3092,6 +3094,12 @@ ServiceWorkerManager::FireControllerChange(ServiceWorkerRegistrationInfo* aRegis continue; } + documents.AppendElement(doc); + } + + // Fire event after iterating mControlledDocuments is done to prevent + // modification by reentering from the event handlers during iteration. + for (auto& doc : documents) { FireControllerChangeOnDocument(doc); } }