Index: Source/web/WebFrame.cpp |
diff --git a/Source/web/WebFrame.cpp b/Source/web/WebFrame.cpp |
index c11f2e11122518e8ec0030f07e42c33a4bc5db89..112978a8d26b922d067355bf4d12e215e7dd8b54 100644 |
--- a/Source/web/WebFrame.cpp |
+++ b/Source/web/WebFrame.cpp |
@@ -41,10 +41,6 @@ bool WebFrame::swap(WebFrame* frame) |
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; |
@@ -78,7 +74,13 @@ bool WebFrame::swap(WebFrame* frame) |
// increments of connected subframes. |
FrameOwner* owner = oldFrame->owner(); |
oldFrame->disconnectOwnerElement(); |
- if (frame->isWebLocalFrame()) { |
+ if (toCoreFrame(frame)) { |
+ FrameOwner* oldOwner = toCoreFrame(frame)->owner(); |
+ toCoreFrame(frame)->setOwner(owner); |
+ if (owner->isLocal()) |
+ toHTMLFrameOwnerElement(owner)->setContentFrame(*toCoreFrame(frame)); |
+ delete oldOwner; |
+ } else if (frame->isWebLocalFrame()) { |
toWebLocalFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name(), nullAtom); |
} else { |
toWebRemoteFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name()); |
@@ -143,6 +145,11 @@ void WebFrame::removeChild(WebFrame* child) |
toCoreFrame(this)->tree().invalidateScopedChildCount(); |
} |
+void WebFrame::setParent(WebFrame* parent) |
+{ |
+ m_parent = parent; |
+} |
+ |
WebFrame* WebFrame::parent() const |
{ |
return m_parent; |