Index: Source/web/WebFrame.cpp |
diff --git a/Source/web/WebFrame.cpp b/Source/web/WebFrame.cpp |
index 826f69d06bb99574a13a752590594315a9d81917..97a88adfd17e8fc77b2adca867052c402ea1bf3c 100644 |
--- a/Source/web/WebFrame.cpp |
+++ b/Source/web/WebFrame.cpp |
@@ -231,19 +231,53 @@ WebFrame::~WebFrame() |
m_openedFrameTracker.reset(0); |
} |
-void WebFrame::traceChildren(Visitor* visitor, WebFrame* frame) |
+void WebFrame::traceFrame(Visitor* visitor, WebFrame* frame) |
{ |
#if ENABLE(OILPAN) |
- // Trace the children frames. |
- WebFrame* child = frame ? frame->firstChild() : 0; |
- while (child) { |
- if (child->isWebLocalFrame()) |
- visitor->trace(toWebLocalFrameImpl(child)); |
- else |
- visitor->trace(toWebRemoteFrameImpl(child)); |
- |
- child = child->nextSibling(); |
- } |
+ if (!frame) |
+ return; |
+ |
+ if (frame->isWebLocalFrame()) |
+ visitor->trace(toWebLocalFrameImpl(frame)); |
+ else |
+ visitor->trace(toWebRemoteFrameImpl(frame)); |
+#endif |
+} |
+ |
+bool WebFrame::isAlive(Visitor* visitor, WebFrame* frame) |
+{ |
+#if ENABLE(OILPAN) |
+ if (!frame) |
+ return false; |
+ |
+ if (frame->isWebLocalFrame()) |
+ return visitor->isAlive(toWebLocalFrameImpl(frame)); |
+ |
+ return visitor->isAlive(toWebRemoteFrameImpl(frame)); |
+#else |
+ ASSERT_NOT_REACHED(); |
+ return true; |
+#endif |
+} |
+ |
+void WebFrame::traceFrames(Visitor* visitor, WebFrame* frame) |
+{ |
+#if ENABLE(OILPAN) |
+ ASSERT(frame); |
+ traceFrame(visitor, frame->m_parent); |
+ for (WebFrame* child = frame->firstChild(); child; child = child->nextSibling()) |
+ traceFrame(visitor, child); |
+ // m_opener is a weak reference. |
+ frame->m_openedFrameTracker->traceFrames(visitor); |
+#endif |
+} |
+ |
+void WebFrame::clearWeakFrames(Visitor* visitor, WebFrame* frame) |
+{ |
+#if ENABLE(OILPAN) |
+ ASSERT(frame); |
+ if (frame->m_opener && !isAlive(visitor, frame->m_opener)) |
+ frame->m_opener = nullptr; |
#endif |
} |