OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/frame/LocalFrameLifecycleNotifier.h" | 6 #include "core/frame/LocalFrameLifecycleNotifier.h" |
7 | 7 |
8 #include "core/frame/LocalFrameLifecycleObserver.h" | 8 #include "core/frame/LocalFrameLifecycleObserver.h" |
9 | 9 |
10 namespace blink { | 10 namespace blink { |
11 | 11 |
12 void LocalFrameLifecycleNotifier::notifyWillDetachFrameHost() | 12 void LocalFrameLifecycleNotifier::notifyWillDetachFrameHost() |
13 { | 13 { |
14 TemporaryChange<IterationType> scope(m_iterating, IteratingOverAll); | 14 TemporaryChange<IterationType> scope(m_iterating, IteratingOverAll); |
| 15 #if !ENABLE(OILPAN) |
| 16 // Notifications perform unknown amounts of heap allocations, |
| 17 // which might trigger (conservative) GCs. This will flush out |
| 18 // dead observers, causing the _non-heap_ set be updated. Snapshot |
| 19 // the observers and explicitly check if they're still alive before |
| 20 // notifying. |
| 21 Vector<RawPtr<LocalFrameLifecycleObserver>> snapshotOfObservers; |
| 22 copyToVector(m_observers, snapshotOfObservers); |
| 23 for (LocalFrameLifecycleObserver* observer : snapshotOfObservers) { |
| 24 if (m_observers.contains(observer)) |
| 25 observer->willDetachFrameHost(); |
| 26 } |
| 27 #else |
15 for (LocalFrameLifecycleObserver* observer : m_observers) | 28 for (LocalFrameLifecycleObserver* observer : m_observers) |
16 observer->willDetachFrameHost(); | 29 observer->willDetachFrameHost(); |
| 30 #endif |
17 } | 31 } |
18 | 32 |
19 } // namespace blink | 33 } // namespace blink |
OLD | NEW |