Index: Source/core/page/PageLifecycleNotifier.cpp |
diff --git a/Source/core/page/PageLifecycleNotifier.cpp b/Source/core/page/PageLifecycleNotifier.cpp |
index 2a6f3869481dc57f8840bc785acf5f467f7ead2a..bffda9050ecfd0c5264725a605a2bad46d0fb014 100644 |
--- a/Source/core/page/PageLifecycleNotifier.cpp |
+++ b/Source/core/page/PageLifecycleNotifier.cpp |
@@ -34,15 +34,43 @@ namespace blink { |
void PageLifecycleNotifier::notifyPageVisibilityChanged() |
{ |
TemporaryChange<IterationType> scope(m_iterating, IteratingOverAll); |
+#if !ENABLE(OILPAN) |
+ // Notifications perform unknown amounts of heap allocations, |
+ // which might trigger (conservative) GCs. This will flush out |
+ // dead observers, causing the _non-heap_ set be updated. Snapshot |
+ // the observers and explicitly check if they're still alive before |
+ // notifying. |
+ Vector<RawPtr<PageLifecycleObserver>> snapshotOfObservers; |
+ copyToVector(m_observers, snapshotOfObservers); |
+ for (PageLifecycleObserver* observer : snapshotOfObservers) { |
+ if (m_observers.contains(observer)) |
+ observer->pageVisibilityChanged(); |
+ } |
+#else |
for (PageLifecycleObserver* observer : m_observers) |
observer->pageVisibilityChanged(); |
+#endif |
} |
void PageLifecycleNotifier::notifyDidCommitLoad(LocalFrame* frame) |
{ |
TemporaryChange<IterationType> scope(m_iterating, IteratingOverAll); |
+#if !ENABLE(OILPAN) |
+ // Notifications perform unknown amounts of heap allocations, |
+ // which might trigger (conservative) GCs. This will flush out |
+ // dead observers, causing the _non-heap_ set be updated. Snapshot |
+ // the observers and explicitly check if they're still alive before |
+ // notifying. |
+ Vector<RawPtr<PageLifecycleObserver>> snapshotOfObservers; |
+ copyToVector(m_observers, snapshotOfObservers); |
+ for (PageLifecycleObserver* observer : snapshotOfObservers) { |
+ if (m_observers.contains(observer)) |
+ observer->didCommitLoad(frame); |
+ } |
+#else |
for (PageLifecycleObserver* observer : m_observers) |
observer->didCommitLoad(frame); |
+#endif |
} |
} // namespace blink |