Index: Source/web/WebFrame.cpp |
diff --git a/Source/web/WebFrame.cpp b/Source/web/WebFrame.cpp |
index acad3e4bc27c6bb7c8218faf64a65c3b84a487d2..accb8a8c187b7bc5aca37dc7d9e457cb7ca6e3cc 100644 |
--- a/Source/web/WebFrame.cpp |
+++ b/Source/web/WebFrame.cpp |
@@ -6,9 +6,41 @@ |
#include "public/web/WebFrame.h" |
#include "web/OpenedFrameTracker.h" |
+#include <algorithm> |
+ |
namespace blink { |
+void WebFrame::swap(WebFrame* frame) |
+{ |
+ using std::swap; |
+ |
+ if (m_parent) { |
+ if (m_parent->m_firstChild == this) |
+ m_parent->m_firstChild = frame; |
+ if (m_parent->m_lastChild == this) |
+ m_parent->m_lastChild = frame; |
+ swap(m_parent, frame->m_parent); |
+ } |
+ if (m_previousSibling) { |
+ m_previousSibling->m_nextSibling = frame; |
+ swap(m_previousSibling, frame->m_previousSibling); |
+ } |
+ if (m_nextSibling) { |
+ m_nextSibling->m_previousSibling = frame; |
+ swap(m_nextSibling, frame->m_nextSibling); |
+ } |
+ if (m_opener) { |
+ m_opener->m_openedFrameTracker->remove(this); |
+ m_opener->m_openedFrameTracker->add(frame); |
+ swap(m_opener, frame->m_opener); |
+ } |
+ if (!m_openedFrameTracker->isEmpty()) { |
+ m_openedFrameTracker->updateOpener(frame); |
+ frame->m_openedFrameTracker.reset(m_openedFrameTracker.release()); |
+ } |
+} |
+ |
WebFrame* WebFrame::opener() const |
{ |
return m_opener; |