#include "config.h"
#include "public/web/WebFrame.h"
+#include "core/frame/FrameHost.h"
+#include "core/frame/FrameView.h"
#include "core/frame/RemoteFrame.h"
#include "core/html/HTMLFrameOwnerElement.h"
#include "platform/UserGestureIndicator.h"
if (!oldFrame->host())
return false;
- // The frame being swapped in should not have a Frame associated
- // with it yet.
- ASSERT(!toCoreFrame(frame));
-
if (m_parent) {
if (m_parent->m_firstChild == this)
m_parent->m_firstChild = frame;
// increments of connected subframes.
FrameOwner* owner = oldFrame->owner();
oldFrame->disconnectOwnerElement();
- if (frame->isWebLocalFrame()) {
+ if (Frame* newFrame = toCoreFrame(frame)) {
+ ASSERT(owner == newFrame->owner());
+ if (owner->isLocal()) {
+ HTMLFrameOwnerElement* ownerElement = toHTMLFrameOwnerElement(owner);
+ ownerElement->setContentFrame(*newFrame);
+ if (newFrame->isLocalFrame())
+ ownerElement->setWidget(toLocalFrame(newFrame)->view());
+ }
+ } else if (frame->isWebLocalFrame()) {
toWebLocalFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name(), nullAtom);
} else {
toWebRemoteFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name());
}
toCoreFrame(this)->tree().invalidateScopedChildCount();
+ toCoreFrame(this)->host()->incrementSubframeCount();
}
void WebFrame::removeChild(WebFrame* child)
child->m_previousSibling = child->m_nextSibling = 0;
toCoreFrame(this)->tree().invalidateScopedChildCount();
+ toCoreFrame(this)->host()->decrementSubframeCount();
+}
+
+void WebFrame::setParent(WebFrame* parent)
+{
+ m_parent = parent;
}
WebFrame* WebFrame::parent() const
m_openedFrameTracker.reset(0);
}
-void WebFrame::traceChildren(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();
- }
-#endif
+void WebFrame::traceFrame(Visitor* visitor, WebFrame* frame)
+{
+ if (!frame)
+ return;
+
+ if (frame->isWebLocalFrame())
+ visitor->trace(toWebLocalFrameImpl(frame));
+ else
+ visitor->trace(toWebRemoteFrameImpl(frame));
+}
+
+void WebFrame::traceFrames(Visitor* visitor, WebFrame* frame)
+{
+ 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);
+}
+
+bool WebFrame::isFrameAlive(Visitor* visitor, const WebFrame* frame)
+{
+ if (!frame)
+ return true;
+
+ if (frame->isWebLocalFrame())
+ return visitor->isAlive(toWebLocalFrameImpl(frame));
+
+ return visitor->isAlive(toWebRemoteFrameImpl(frame));
+}
+
+void WebFrame::clearWeakFrames(Visitor* visitor)
+{
+ if (!isFrameAlive(visitor, m_opener))
+ m_opener = nullptr;
}
+#endif
} // namespace blink