summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/web/WebFrame.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/web/WebFrame.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/web/WebFrame.cpp193
1 files changed, 193 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/web/WebFrame.cpp b/chromium/third_party/WebKit/Source/web/WebFrame.cpp
new file mode 100644
index 00000000000..01e08be5bac
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/web/WebFrame.cpp
@@ -0,0 +1,193 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+#include "public/web/WebFrame.h"
+
+#include "core/frame/RemoteFrame.h"
+#include "web/OpenedFrameTracker.h"
+#include "web/WebLocalFrameImpl.h"
+#include "web/WebRemoteFrameImpl.h"
+#include <algorithm>
+
+
+namespace blink {
+
+WebCore::Frame* toWebCoreFrame(const WebFrame* frame)
+{
+ if (!frame)
+ return 0;
+
+ return frame->isWebLocalFrame()
+ ? static_cast<WebCore::Frame*>(toWebLocalFrameImpl(frame)->frame())
+ : toWebRemoteFrameImpl(frame)->frame();
+}
+
+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;
+}
+
+void WebFrame::setOpener(WebFrame* opener)
+{
+ if (m_opener)
+ m_opener->m_openedFrameTracker->remove(this);
+ if (opener)
+ opener->m_openedFrameTracker->add(this);
+ m_opener = opener;
+}
+
+void WebFrame::appendChild(WebFrame* child)
+{
+ // FIXME: Original code asserts that the frames have the same Page. We
+ // should add an equivalent check... figure out what.
+ child->m_parent = this;
+ WebFrame* oldLast = m_lastChild;
+ m_lastChild = child;
+
+ if (oldLast) {
+ child->m_previousSibling = oldLast;
+ oldLast->m_nextSibling = child;
+ } else {
+ m_firstChild = child;
+ }
+
+ toWebCoreFrame(this)->tree().invalidateScopedChildCount();
+}
+
+void WebFrame::removeChild(WebFrame* child)
+{
+ child->m_parent = 0;
+
+ if (m_firstChild == child)
+ m_firstChild = child->m_nextSibling;
+ else
+ child->m_previousSibling->m_nextSibling = child->m_nextSibling;
+
+ if (m_lastChild == child)
+ m_lastChild = child->m_previousSibling;
+ else
+ child->m_nextSibling->m_previousSibling = child->m_previousSibling;
+
+ child->m_previousSibling = child->m_nextSibling = 0;
+
+ toWebCoreFrame(this)->tree().invalidateScopedChildCount();
+}
+
+WebFrame* WebFrame::parent() const
+{
+ return m_parent;
+}
+
+WebFrame* WebFrame::top() const
+{
+ WebFrame* frame = const_cast<WebFrame*>(this);
+ for (WebFrame* parent = frame; parent; parent = parent->m_parent)
+ frame = parent;
+ return frame;
+}
+
+WebFrame* WebFrame::firstChild() const
+{
+ return m_firstChild;
+}
+
+WebFrame* WebFrame::lastChild() const
+{
+ return m_lastChild;
+}
+
+WebFrame* WebFrame::previousSibling() const
+{
+ return m_previousSibling;
+}
+
+WebFrame* WebFrame::nextSibling() const
+{
+ return m_nextSibling;
+}
+
+WebFrame* WebFrame::traversePrevious(bool wrap) const
+{
+ WebCore::Frame* frame = toWebCoreFrame(this);
+ if (!frame)
+ return 0;
+ return fromFrame(frame->tree().traversePreviousWithWrap(wrap));
+}
+
+WebFrame* WebFrame::traverseNext(bool wrap) const
+{
+ WebCore::Frame* frame = toWebCoreFrame(this);
+ if (!frame)
+ return 0;
+ return fromFrame(frame->tree().traverseNextWithWrap(wrap));
+}
+
+WebFrame* WebFrame::findChildByName(const WebString& name) const
+{
+ WebCore::Frame* frame = toWebCoreFrame(this);
+ if (!frame)
+ return 0;
+ // FIXME: It's not clear this should ever be called to find a remote frame.
+ // Perhaps just disallow that completely?
+ return fromFrame(frame->tree().child(name));
+}
+
+WebFrame* WebFrame::fromFrame(WebCore::Frame* frame)
+{
+ if (!frame)
+ return 0;
+
+ if (frame->isLocalFrame())
+ return WebLocalFrameImpl::fromFrame(toLocalFrame(*frame));
+ return WebRemoteFrameImpl::fromFrame(toRemoteFrame(*frame));
+}
+
+WebFrame::WebFrame()
+ : m_parent(0)
+ , m_previousSibling(0)
+ , m_nextSibling(0)
+ , m_firstChild(0)
+ , m_lastChild(0)
+ , m_opener(0)
+ , m_openedFrameTracker(new OpenedFrameTracker)
+{
+}
+
+WebFrame::~WebFrame()
+{
+ m_openedFrameTracker.reset(0);
+}
+
+} // namespace blink