1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "public/web/WebFrame.h"
8 #include "core/frame/RemoteFrame.h"
9 #include "web/OpenedFrameTracker.h"
10 #include "web/WebLocalFrameImpl.h"
11 #include "web/WebRemoteFrameImpl.h"
17 WebCore::Frame* toWebCoreFrame(const WebFrame* frame)
22 return frame->isWebLocalFrame()
23 ? static_cast<WebCore::Frame*>(toWebLocalFrameImpl(frame)->frame())
24 : toWebRemoteFrameImpl(frame)->frame();
27 void WebFrame::swap(WebFrame* frame)
32 if (m_parent->m_firstChild == this)
33 m_parent->m_firstChild = frame;
34 if (m_parent->m_lastChild == this)
35 m_parent->m_lastChild = frame;
36 swap(m_parent, frame->m_parent);
38 if (m_previousSibling) {
39 m_previousSibling->m_nextSibling = frame;
40 swap(m_previousSibling, frame->m_previousSibling);
43 m_nextSibling->m_previousSibling = frame;
44 swap(m_nextSibling, frame->m_nextSibling);
47 m_opener->m_openedFrameTracker->remove(this);
48 m_opener->m_openedFrameTracker->add(frame);
49 swap(m_opener, frame->m_opener);
51 if (!m_openedFrameTracker->isEmpty()) {
52 m_openedFrameTracker->updateOpener(frame);
53 frame->m_openedFrameTracker.reset(m_openedFrameTracker.release());
57 WebFrame* WebFrame::opener() const
62 void WebFrame::setOpener(WebFrame* opener)
65 m_opener->m_openedFrameTracker->remove(this);
67 opener->m_openedFrameTracker->add(this);
71 void WebFrame::appendChild(WebFrame* child)
73 // FIXME: Original code asserts that the frames have the same Page. We
74 // should add an equivalent check... figure out what.
75 child->m_parent = this;
76 WebFrame* oldLast = m_lastChild;
80 child->m_previousSibling = oldLast;
81 oldLast->m_nextSibling = child;
86 toWebCoreFrame(this)->tree().invalidateScopedChildCount();
89 void WebFrame::removeChild(WebFrame* child)
93 if (m_firstChild == child)
94 m_firstChild = child->m_nextSibling;
96 child->m_previousSibling->m_nextSibling = child->m_nextSibling;
98 if (m_lastChild == child)
99 m_lastChild = child->m_previousSibling;
101 child->m_nextSibling->m_previousSibling = child->m_previousSibling;
103 child->m_previousSibling = child->m_nextSibling = 0;
105 toWebCoreFrame(this)->tree().invalidateScopedChildCount();
108 WebFrame* WebFrame::parent() const
113 WebFrame* WebFrame::top() const
115 WebFrame* frame = const_cast<WebFrame*>(this);
116 for (WebFrame* parent = frame; parent; parent = parent->m_parent)
121 WebFrame* WebFrame::firstChild() const
126 WebFrame* WebFrame::lastChild() const
131 WebFrame* WebFrame::previousSibling() const
133 return m_previousSibling;
136 WebFrame* WebFrame::nextSibling() const
138 return m_nextSibling;
141 WebFrame* WebFrame::traversePrevious(bool wrap) const
143 WebCore::Frame* frame = toWebCoreFrame(this);
146 return fromFrame(frame->tree().traversePreviousWithWrap(wrap));
149 WebFrame* WebFrame::traverseNext(bool wrap) const
151 WebCore::Frame* frame = toWebCoreFrame(this);
154 return fromFrame(frame->tree().traverseNextWithWrap(wrap));
157 WebFrame* WebFrame::findChildByName(const WebString& name) const
159 WebCore::Frame* frame = toWebCoreFrame(this);
162 // FIXME: It's not clear this should ever be called to find a remote frame.
163 // Perhaps just disallow that completely?
164 return fromFrame(frame->tree().child(name));
167 WebFrame* WebFrame::fromFrame(WebCore::Frame* frame)
172 if (frame->isLocalFrame())
173 return WebLocalFrameImpl::fromFrame(toLocalFrame(*frame));
174 return WebRemoteFrameImpl::fromFrame(toRemoteFrame(*frame));
179 , m_previousSibling(0)
184 , m_openedFrameTracker(new OpenedFrameTracker)
188 WebFrame::~WebFrame()
190 m_openedFrameTracker.reset(0);