• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
3  *                     1999 Lars Knoll <knoll@kde.org>
4  *                     1999 Antti Koivisto <koivisto@kde.org>
5  *                     2000 Simon Hausmann <hausmann@kde.org>
6  *                     2000 Stefan Schimanski <1Stein@gmx.de>
7  *                     2001 George Staikos <staikos@kde.org>
8  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
9  * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com>
10  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
11  * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
12  * Copyright (C) 2008 Google Inc.
13  *
14  * This library is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU Library General Public
16  * License as published by the Free Software Foundation; either
17  * version 2 of the License, or (at your option) any later version.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22  * Library General Public License for more details.
23  *
24  * You should have received a copy of the GNU Library General Public License
25  * along with this library; see the file COPYING.LIB.  If not, write to
26  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
27  * Boston, MA 02110-1301, USA.
28  */
29 
30 #include "config.h"
31 #include "core/frame/Frame.h"
32 
33 #include "core/dom/DocumentType.h"
34 #include "core/events/Event.h"
35 #include "core/frame/LocalDOMWindow.h"
36 #include "core/frame/FrameHost.h"
37 #include "core/frame/Settings.h"
38 #include "core/html/HTMLFrameElementBase.h"
39 #include "core/inspector/InspectorInstrumentation.h"
40 #include "core/loader/EmptyClients.h"
41 #include "core/loader/FrameLoaderClient.h"
42 #include "core/page/Chrome.h"
43 #include "core/page/ChromeClient.h"
44 #include "core/page/EventHandler.h"
45 #include "core/page/FocusController.h"
46 #include "core/page/Page.h"
47 #include "core/rendering/RenderLayer.h"
48 #include "core/rendering/RenderPart.h"
49 #include "platform/graphics/GraphicsLayer.h"
50 #include "public/platform/WebLayer.h"
51 #include "wtf/PassOwnPtr.h"
52 #include "wtf/RefCountedLeakCounter.h"
53 
54 namespace blink {
55 
56 using namespace HTMLNames;
57 
58 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, frameCounter, ("Frame"));
59 
Frame(FrameClient * client,FrameHost * host,FrameOwner * owner)60 Frame::Frame(FrameClient* client, FrameHost* host, FrameOwner* owner)
61     : m_treeNode(this)
62     , m_host(host)
63     , m_owner(owner)
64     , m_client(client)
65     , m_remotePlatformLayer(0)
66 {
67     ASSERT(page());
68 
69 #ifndef NDEBUG
70     frameCounter.increment();
71 #endif
72 
73     if (m_owner) {
74         page()->incrementSubframeCount();
75         if (m_owner->isLocal())
76             toHTMLFrameOwnerElement(m_owner)->setContentFrame(*this);
77     } else {
78         page()->setMainFrame(this);
79     }
80 }
81 
~Frame()82 Frame::~Frame()
83 {
84 #if ENABLE(OILPAN)
85     ASSERT(!m_owner);
86 #else
87     // FIXME: We should not be doing all this work inside the destructor
88     disconnectOwnerElement();
89     setDOMWindow(nullptr);
90 #endif
91 
92 #ifndef NDEBUG
93     frameCounter.decrement();
94 #endif
95 }
96 
trace(Visitor * visitor)97 void Frame::trace(Visitor* visitor)
98 {
99     visitor->trace(m_treeNode);
100     visitor->trace(m_host);
101     visitor->trace(m_owner);
102     visitor->trace(m_domWindow);
103 }
104 
detachChildren()105 void Frame::detachChildren()
106 {
107     typedef WillBeHeapVector<RefPtrWillBeMember<Frame> > FrameVector;
108     FrameVector childrenToDetach;
109     childrenToDetach.reserveCapacity(tree().childCount());
110     for (Frame* child = tree().firstChild(); child; child = child->tree().nextSibling())
111         childrenToDetach.append(child);
112     FrameVector::iterator end = childrenToDetach.end();
113     for (FrameVector::iterator it = childrenToDetach.begin(); it != end; ++it)
114         (*it)->detach();
115 }
116 
host() const117 FrameHost* Frame::host() const
118 {
119     return m_host;
120 }
121 
page() const122 Page* Frame::page() const
123 {
124     if (m_host)
125         return &m_host->page();
126     return 0;
127 }
128 
settings() const129 Settings* Frame::settings() const
130 {
131     if (m_host)
132         return &m_host->settings();
133     return 0;
134 }
135 
setDOMWindow(PassRefPtrWillBeRawPtr<LocalDOMWindow> domWindow)136 void Frame::setDOMWindow(PassRefPtrWillBeRawPtr<LocalDOMWindow> domWindow)
137 {
138     if (m_domWindow)
139         m_domWindow->reset();
140 
141     m_domWindow = domWindow;
142 }
143 
emptyChromeClient()144 static ChromeClient& emptyChromeClient()
145 {
146     DEFINE_STATIC_LOCAL(EmptyChromeClient, client, ());
147     return client;
148 }
149 
chromeClient() const150 ChromeClient& Frame::chromeClient() const
151 {
152     if (Page* page = this->page())
153         return page->chrome().client();
154     return emptyChromeClient();
155 }
156 
ownerRenderer() const157 RenderPart* Frame::ownerRenderer() const
158 {
159     if (!deprecatedLocalOwner())
160         return 0;
161     RenderObject* object = deprecatedLocalOwner()->renderer();
162     if (!object)
163         return 0;
164     // FIXME: If <object> is ever fixed to disassociate itself from frames
165     // that it has started but canceled, then this can turn into an ASSERT
166     // since ownerElement() would be 0 when the load is canceled.
167     // https://bugs.webkit.org/show_bug.cgi?id=18585
168     if (!object->isRenderPart())
169         return 0;
170     return toRenderPart(object);
171 }
172 
setRemotePlatformLayer(WebLayer * layer)173 void Frame::setRemotePlatformLayer(WebLayer* layer)
174 {
175     if (m_remotePlatformLayer)
176         GraphicsLayer::unregisterContentsLayer(m_remotePlatformLayer);
177     m_remotePlatformLayer = layer;
178     if (m_remotePlatformLayer)
179         GraphicsLayer::registerContentsLayer(layer);
180 
181     ASSERT(owner());
182     toHTMLFrameOwnerElement(owner())->setNeedsCompositingUpdate();
183     if (RenderPart* renderer = ownerRenderer())
184         renderer->layer()->updateSelfPaintingLayer();
185 }
186 
isMainFrame() const187 bool Frame::isMainFrame() const
188 {
189     Page* page = this->page();
190     return page && this == page->mainFrame();
191 }
192 
isLocalRoot() const193 bool Frame::isLocalRoot() const
194 {
195     if (isRemoteFrame())
196         return false;
197 
198     if (!tree().parent())
199         return true;
200 
201     return tree().parent()->isRemoteFrame();
202 }
203 
disconnectOwnerElement()204 void Frame::disconnectOwnerElement()
205 {
206     if (m_owner) {
207         if (m_owner->isLocal())
208             toHTMLFrameOwnerElement(m_owner)->clearContentFrame();
209         if (page())
210             page()->decrementSubframeCount();
211     }
212     m_owner = nullptr;
213 }
214 
deprecatedLocalOwner() const215 HTMLFrameOwnerElement* Frame::deprecatedLocalOwner() const
216 {
217     return m_owner && m_owner->isLocal() ? toHTMLFrameOwnerElement(m_owner) : 0;
218 }
219 
220 } // namespace blink
221