WebCore:
[WebKit-https.git] / WebCore / html / HTMLIFrameElement.cpp
1 /**
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2000 Simon Hausmann (hausmann@kde.org)
7  *           (C) 2001 Dirk Mueller (mueller@kde.org)
8  * Copyright (C) 2004, 2006 Apple Computer, Inc.
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public License
21  * along with this library; see the file COPYING.LIB.  If not, write to
22  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23  * Boston, MA 02111-1307, USA.
24  */
25 #include "config.h"
26 #include "HTMLIFrameElement.h"
27
28 #include "CSSPropertyNames.h"
29 #include "Frame.h"
30 #include "FrameTree.h"
31 #include "HTMLDocument.h"
32 #include "HTMLNames.h"
33 #include "Page.h"
34 #include "RenderPartObject.h"
35
36 namespace WebCore {
37
38 using namespace HTMLNames;
39
40 HTMLIFrameElement::HTMLIFrameElement(Document* doc)
41     : HTMLFrameElement(iframeTag, doc)
42     , needWidgetUpdate(false)
43 {
44     m_frameBorder = false;
45     m_marginWidth = -1;
46     m_marginHeight = -1;
47 }
48
49 HTMLIFrameElement::~HTMLIFrameElement()
50 {
51 }
52
53 bool HTMLIFrameElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const
54 {
55     if (attrName == widthAttr || attrName == heightAttr) {
56         result = eUniversal;
57         return false;
58     }
59     
60     if (attrName == alignAttr) {
61         result = eReplaced; // Share with <img> since the alignment behavior is the same.
62         return false;
63     }
64     
65     return HTMLElement::mapToEntry(attrName, result);
66 }
67
68 void HTMLIFrameElement::parseMappedAttribute(MappedAttribute *attr)
69 {
70     if (attr->name() == widthAttr)
71         addCSSLength(attr, CSS_PROP_WIDTH, attr->value());
72     else if (attr->name() == heightAttr)
73         addCSSLength(attr, CSS_PROP_HEIGHT, attr->value());
74     else if (attr->name() == alignAttr)
75         addHTMLAlignment(attr);
76     else if (attr->name() == nameAttr) {
77         String newNameAttr = attr->value();
78         if (inDocument() && document()->isHTMLDocument()) {
79             HTMLDocument *doc = static_cast<HTMLDocument *>(document());
80             doc->removeDocExtraNamedItem(oldNameAttr);
81             doc->addDocExtraNamedItem(newNameAttr);
82         }
83         oldNameAttr = newNameAttr;
84     } else
85         HTMLFrameElement::parseMappedAttribute(attr);
86 }
87
88 void HTMLIFrameElement::insertedIntoDocument()
89 {
90     if (document()->isHTMLDocument()) {
91         HTMLDocument *doc = static_cast<HTMLDocument *>(document());
92         doc->addDocExtraNamedItem(oldNameAttr);
93     }
94
95     HTMLElement::insertedIntoDocument();
96     
97     // Load the frame
98     m_name = getAttribute(nameAttr);
99     if (m_name.isNull())
100         m_name = getAttribute(idAttr);
101     
102     Frame* parentFrame = document()->frame();
103     if (parentFrame) {
104         parentFrame->page()->incrementFrameCount();
105         m_name = parentFrame->tree()->uniqueChildName(m_name);
106         
107         openURL();
108     }    
109 }
110
111 void HTMLIFrameElement::willRemove()
112 {
113     if (Frame* frame = contentFrame()) {
114         frame->disconnectOwnerElement();
115         frame->page()->decrementFrameCount();
116         frame->frameDetached();
117         ASSERT(!contentFrame());
118     }
119
120     HTMLElement::willRemove();
121 }
122
123 void HTMLIFrameElement::removedFromDocument()
124 {
125     if (document()->isHTMLDocument()) {
126         HTMLDocument *doc = static_cast<HTMLDocument *>(document());
127         doc->removeDocExtraNamedItem(oldNameAttr);
128     }
129
130     HTMLElement::removedFromDocument();
131 }
132
133 bool HTMLIFrameElement::rendererIsNeeded(RenderStyle *style)
134 {
135     // Don't ignore display: none the way frame does.
136     return isURLAllowed(m_URL) && style->display() != NONE;
137 }
138
139 RenderObject *HTMLIFrameElement::createRenderer(RenderArena *arena, RenderStyle *style)
140 {
141     return new (arena) RenderPartObject(this);
142 }
143
144 void HTMLIFrameElement::attach()
145 {
146     HTMLElement::attach();
147
148     RenderPartObject* renderPart = static_cast<RenderPartObject*>(renderer());
149
150     if (renderPart) {        
151         if (!contentFrame())
152             openURL();
153
154         if (contentFrame()) {
155             renderPart->setWidget(contentFrame()->view());
156             renderPart->updateWidget();
157             needWidgetUpdate = false;
158         }
159     }
160 }
161
162 void HTMLIFrameElement::detach()
163 {
164     HTMLElement::detach();
165 }
166
167
168 void HTMLIFrameElement::recalcStyle( StyleChange ch )
169 {
170     if (needWidgetUpdate) {
171         if (renderer())
172             static_cast<RenderPartObject*>(renderer())->updateWidget();
173         needWidgetUpdate = false;
174     }
175     HTMLElement::recalcStyle( ch );
176 }
177
178 void HTMLIFrameElement::openURL()
179 {
180     if (!isURLAllowed(m_URL))
181         return;
182     if (m_URL.isEmpty())
183         m_URL = "about:blank";
184     
185     document()->frame()->requestFrame(this, m_URL, m_name);
186     if (contentFrame())
187         contentFrame()->setInViewSourceMode(viewSourceMode());
188 }
189
190 bool HTMLIFrameElement::isURLAttribute(Attribute *attr) const
191 {
192     return attr->name() == srcAttr;
193 }
194
195 String HTMLIFrameElement::align() const
196 {
197     return getAttribute(alignAttr);
198 }
199
200 void HTMLIFrameElement::setAlign(const String &value)
201 {
202     setAttribute(alignAttr, value);
203 }
204
205 String HTMLIFrameElement::height() const
206 {
207     return getAttribute(heightAttr);
208 }
209
210 void HTMLIFrameElement::setHeight(const String &value)
211 {
212     setAttribute(heightAttr, value);
213 }
214
215 String HTMLIFrameElement::src() const
216 {
217     return document()->completeURL(getAttribute(srcAttr));
218 }
219
220 String HTMLIFrameElement::width() const
221 {
222     return getAttribute(widthAttr);
223 }
224
225 void HTMLIFrameElement::setWidth(const String &value)
226 {
227     setAttribute(widthAttr, value);
228 }
229
230 }