OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> | 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
3 * 1999 Lars Knoll <knoll@kde.org> | 3 * 1999 Lars Knoll <knoll@kde.org> |
4 * 1999 Antti Koivisto <koivisto@kde.org> | 4 * 1999 Antti Koivisto <koivisto@kde.org> |
5 * 2000 Simon Hausmann <hausmann@kde.org> | 5 * 2000 Simon Hausmann <hausmann@kde.org> |
6 * 2000 Stefan Schimanski <1Stein@gmx.de> | 6 * 2000 Stefan Schimanski <1Stein@gmx.de> |
7 * 2001 George Staikos <staikos@kde.org> | 7 * 2001 George Staikos <staikos@kde.org> |
8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> | 9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> |
10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 , m_owner(owner) | 63 , m_owner(owner) |
64 , m_client(client) | 64 , m_client(client) |
65 , m_remotePlatformLayer(0) | 65 , m_remotePlatformLayer(0) |
66 { | 66 { |
67 ASSERT(page()); | 67 ASSERT(page()); |
68 | 68 |
69 #ifndef NDEBUG | 69 #ifndef NDEBUG |
70 frameCounter.increment(); | 70 frameCounter.increment(); |
71 #endif | 71 #endif |
72 | 72 |
73 m_host->incrementFrameCount(); | |
74 | |
75 if (m_owner) { | 73 if (m_owner) { |
| 74 page()->incrementSubframeCount(); |
76 if (m_owner->isLocal()) | 75 if (m_owner->isLocal()) |
77 toHTMLFrameOwnerElement(m_owner)->setContentFrame(*this); | 76 toHTMLFrameOwnerElement(m_owner)->setContentFrame(*this); |
78 } else { | 77 } else { |
79 page()->setMainFrame(this); | 78 page()->setMainFrame(this); |
80 } | 79 } |
81 } | 80 } |
82 | 81 |
83 Frame::~Frame() | 82 Frame::~Frame() |
84 { | 83 { |
85 #if ENABLE(OILPAN) | 84 #if ENABLE(OILPAN) |
(...skipping 10 matching lines...) Expand all Loading... |
96 } | 95 } |
97 | 96 |
98 void Frame::trace(Visitor* visitor) | 97 void Frame::trace(Visitor* visitor) |
99 { | 98 { |
100 visitor->trace(m_treeNode); | 99 visitor->trace(m_treeNode); |
101 visitor->trace(m_host); | 100 visitor->trace(m_host); |
102 visitor->trace(m_owner); | 101 visitor->trace(m_owner); |
103 visitor->trace(m_domWindow); | 102 visitor->trace(m_domWindow); |
104 } | 103 } |
105 | 104 |
106 void Frame::detach() | |
107 { | |
108 // client() should never be null because that means we somehow re-entered | |
109 // the frame detach code... but it is sometimes. | |
110 // FIXME: Understand why this is happening so we can document this insanity. | |
111 // http://crbug.com/371084 is a probable explanation. | |
112 if (!client()) | |
113 return; | |
114 // FIXME: Should we enforce the invariant that all pointers nulled in this f
unction | |
115 // get nulled at the same time? | |
116 m_host->decrementFrameCount(); | |
117 m_host = nullptr; | |
118 // After this, we must no longer talk to the client since this clears | |
119 // its owning reference back to our owning LocalFrame. | |
120 m_client->detached(); | |
121 m_client = nullptr; | |
122 } | |
123 | |
124 void Frame::detachChildren() | 105 void Frame::detachChildren() |
125 { | 106 { |
126 typedef WillBeHeapVector<RefPtrWillBeMember<Frame> > FrameVector; | 107 typedef WillBeHeapVector<RefPtrWillBeMember<Frame> > FrameVector; |
127 FrameVector childrenToDetach; | 108 FrameVector childrenToDetach; |
128 childrenToDetach.reserveCapacity(tree().childCount()); | 109 childrenToDetach.reserveCapacity(tree().childCount()); |
129 for (Frame* child = tree().firstChild(); child; child = child->tree().nextSi
bling()) | 110 for (Frame* child = tree().firstChild(); child; child = child->tree().nextSi
bling()) |
130 childrenToDetach.append(child); | 111 childrenToDetach.append(child); |
131 FrameVector::iterator end = childrenToDetach.end(); | 112 FrameVector::iterator end = childrenToDetach.end(); |
132 for (FrameVector::iterator it = childrenToDetach.begin(); it != end; ++it) | 113 for (FrameVector::iterator it = childrenToDetach.begin(); it != end; ++it) |
133 (*it)->detach(); | 114 (*it)->detach(); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 return true; | 199 return true; |
219 | 200 |
220 return tree().parent()->isRemoteFrame(); | 201 return tree().parent()->isRemoteFrame(); |
221 } | 202 } |
222 | 203 |
223 void Frame::disconnectOwnerElement() | 204 void Frame::disconnectOwnerElement() |
224 { | 205 { |
225 if (m_owner) { | 206 if (m_owner) { |
226 if (m_owner->isLocal()) | 207 if (m_owner->isLocal()) |
227 toHTMLFrameOwnerElement(m_owner)->clearContentFrame(); | 208 toHTMLFrameOwnerElement(m_owner)->clearContentFrame(); |
| 209 if (page()) |
| 210 page()->decrementSubframeCount(); |
228 } | 211 } |
229 m_owner = nullptr; | 212 m_owner = nullptr; |
230 } | 213 } |
231 | 214 |
232 HTMLFrameOwnerElement* Frame::deprecatedLocalOwner() const | 215 HTMLFrameOwnerElement* Frame::deprecatedLocalOwner() const |
233 { | 216 { |
234 return m_owner && m_owner->isLocal() ? toHTMLFrameOwnerElement(m_owner) : 0; | 217 return m_owner && m_owner->isLocal() ? toHTMLFrameOwnerElement(m_owner) : 0; |
235 } | 218 } |
236 | 219 |
237 } // namespace blink | 220 } // namespace blink |
OLD | NEW |