1323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// found in the LICENSE file.
4323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
5323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "config.h"
6323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "public/web/WebFrame.h"
7323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
8d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/frame/RemoteFrame.h"
9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/html/HTMLFrameOwnerElement.h"
107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/UserGestureIndicator.h"
117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/heap/Handle.h"
12323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "web/OpenedFrameTracker.h"
13d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "web/WebLocalFrameImpl.h"
14d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "web/WebRemoteFrameImpl.h"
15323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include <algorithm>
16323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
17323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)namespace blink {
18323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
19e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Frame* toCoreFrame(const WebFrame* frame)
20d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
21d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!frame)
22d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return 0;
23d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
24d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return frame->isWebLocalFrame()
25e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        ? static_cast<Frame*>(toWebLocalFrameImpl(frame)->frame())
26d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        : toWebRemoteFrameImpl(frame)->frame();
27d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
28d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool WebFrame::swap(WebFrame* frame)
30323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
31323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    using std::swap;
327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<Frame> oldFrame = toCoreFrame(this);
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // All child frames must be detached first.
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    oldFrame->detachChildren();
367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // If the frame has been detached during detaching its children, return
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // immediately.
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: There is no unit test for this condition, so one needs to be
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // written.
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!oldFrame->host())
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
43323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
449e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // The frame being swapped in should not have a Frame associated
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // with it yet.
46e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(!toCoreFrame(frame));
47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
48323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_parent) {
49323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (m_parent->m_firstChild == this)
50323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            m_parent->m_firstChild = frame;
51323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (m_parent->m_lastChild == this)
52323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            m_parent->m_lastChild = frame;
53323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        swap(m_parent, frame->m_parent);
54323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
56323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_previousSibling) {
57323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_previousSibling->m_nextSibling = frame;
58323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        swap(m_previousSibling, frame->m_previousSibling);
59323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
60323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_nextSibling) {
61323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_nextSibling->m_previousSibling = frame;
62323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        swap(m_nextSibling, frame->m_nextSibling);
63323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
65323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_opener) {
66323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_opener->m_openedFrameTracker->remove(this);
67323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_opener->m_openedFrameTracker->add(frame);
68323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        swap(m_opener, frame->m_opener);
69323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
70323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (!m_openedFrameTracker->isEmpty()) {
71323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_openedFrameTracker->updateOpener(frame);
72323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        frame->m_openedFrameTracker.reset(m_openedFrameTracker.release());
73323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
759e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // Finally, clone the state of the current Frame into one matching
76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // the type of the passed in WebFrame.
77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME: This is a bit clunky; this results in pointless decrements and
78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // increments of connected subframes.
79e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    FrameOwner* owner = oldFrame->owner();
80197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    oldFrame->disconnectOwnerElement();
81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (frame->isWebLocalFrame()) {
82e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        toWebLocalFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name(), nullAtom);
83197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    } else {
84e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        toWebRemoteFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name());
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return true;
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebFrame::detach()
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    toCoreFrame(this)->detach();
93323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
94323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
95323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame* WebFrame::opener() const
96323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
97323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return m_opener;
98323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
99323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
100323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebFrame::setOpener(WebFrame* opener)
101323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
102323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_opener)
103323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_opener->m_openedFrameTracker->remove(this);
104323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (opener)
105323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        opener->m_openedFrameTracker->add(this);
106323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    m_opener = opener;
107323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
108323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
109323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebFrame::appendChild(WebFrame* child)
110323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
111323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // FIXME: Original code asserts that the frames have the same Page. We
112323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // should add an equivalent check... figure out what.
113323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    child->m_parent = this;
114323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WebFrame* oldLast = m_lastChild;
115323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    m_lastChild = child;
116323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
117323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (oldLast) {
118323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        child->m_previousSibling = oldLast;
119323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        oldLast->m_nextSibling = child;
120323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    } else {
121323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_firstChild = child;
122323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
12376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
124e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    toCoreFrame(this)->tree().invalidateScopedChildCount();
125323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
126323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
127323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebFrame::removeChild(WebFrame* child)
128323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
129323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    child->m_parent = 0;
130323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
131323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_firstChild == child)
132323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_firstChild = child->m_nextSibling;
133323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    else
134323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        child->m_previousSibling->m_nextSibling = child->m_nextSibling;
135323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
136323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_lastChild == child)
137323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_lastChild = child->m_previousSibling;
138323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    else
139323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        child->m_nextSibling->m_previousSibling = child->m_previousSibling;
140323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
141323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    child->m_previousSibling = child->m_nextSibling = 0;
14276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
143e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    toCoreFrame(this)->tree().invalidateScopedChildCount();
144323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
145323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
146323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame* WebFrame::parent() const
147323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
148323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return m_parent;
149323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
150323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
151323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame* WebFrame::top() const
152323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
153323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WebFrame* frame = const_cast<WebFrame*>(this);
154323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    for (WebFrame* parent = frame; parent; parent = parent->m_parent)
155323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        frame = parent;
156323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return frame;
157323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
158323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
159323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame* WebFrame::firstChild() const
160323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
161323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return m_firstChild;
162323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
163323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
164323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame* WebFrame::lastChild() const
165323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
166323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return m_lastChild;
167323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
168323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
169323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame* WebFrame::previousSibling() const
170323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
171323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return m_previousSibling;
172323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
173323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
174323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame* WebFrame::nextSibling() const
175323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
176323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return m_nextSibling;
177323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
178323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
17976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)WebFrame* WebFrame::traversePrevious(bool wrap) const
18076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
181e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (Frame* frame = toCoreFrame(this))
182e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return fromFrame(frame->tree().traversePreviousWithWrap(wrap));
183e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return 0;
18476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
18576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
18676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)WebFrame* WebFrame::traverseNext(bool wrap) const
18776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
188e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (Frame* frame = toCoreFrame(this))
189e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return fromFrame(frame->tree().traverseNextWithWrap(wrap));
190e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return 0;
19176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
19276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
19376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)WebFrame* WebFrame::findChildByName(const WebString& name) const
19476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
195e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Frame* frame = toCoreFrame(this);
19676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (!frame)
19776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return 0;
19876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    // FIXME: It's not clear this should ever be called to find a remote frame.
19976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    // Perhaps just disallow that completely?
20076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    return fromFrame(frame->tree().child(name));
20176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
20276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
2039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)WebFrame* WebFrame::fromFrame(Frame* frame)
20476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
20576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (!frame)
20676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return 0;
20776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
20876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (frame->isLocalFrame())
20976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return WebLocalFrameImpl::fromFrame(toLocalFrame(*frame));
21076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    return WebRemoteFrameImpl::fromFrame(toRemoteFrame(*frame));
21176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
21276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
213323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame::WebFrame()
214323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    : m_parent(0)
215323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    , m_previousSibling(0)
216323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    , m_nextSibling(0)
217323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    , m_firstChild(0)
218323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    , m_lastChild(0)
219323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    , m_opener(0)
220323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    , m_openedFrameTracker(new OpenedFrameTracker)
221323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
222323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
223323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
224323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebFrame::~WebFrame()
225323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
226323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    m_openedFrameTracker.reset(0);
227323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
228323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
2297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebFrame::traceChildren(Visitor* visitor, WebFrame* frame)
2307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if ENABLE(OILPAN)
2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Trace the children frames.
2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebFrame* child = frame ? frame->firstChild() : 0;
2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    while (child) {
2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (child->isWebLocalFrame())
2367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            visitor->trace(toWebLocalFrameImpl(child));
2377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        else
2387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            visitor->trace(toWebRemoteFrameImpl(child));
2397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        child = child->nextSibling();
2417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
2437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
245323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} // namespace blink
246