31006359718ab89054e9b8b1348630ca859a490d
[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         renderPart->setWidget(contentFrame()->view());
155         renderPart->updateWidget();
156         needWidgetUpdate = false;
157     }
158 }
159
160 void HTMLIFrameElement::detach()
161 {
162     HTMLElement::detach();
163 }
164
165
166 void HTMLIFrameElement::recalcStyle( StyleChange ch )
167 {
168     if (needWidgetUpdate) {
169         if (renderer())
170             static_cast<RenderPartObject*>(renderer())->updateWidget();
171         needWidgetUpdate = false;
172     }
173     HTMLElement::recalcStyle( ch );
174 }
175
176 void HTMLIFrameElement::openURL()
177 {
178     if (!isURLAllowed(m_URL))
179         return;
180     if (m_URL.isEmpty())
181         m_URL = "about:blank";
182     
183     document()->frame()->requestFrame(this, m_URL, m_name);
184     if (contentFrame())
185         contentFrame()->setInViewSourceMode(viewSourceMode());
186 }
187
188 bool HTMLIFrameElement::isURLAttribute(Attribute *attr) const
189 {
190     return attr->name() == srcAttr;
191 }
192
193 String HTMLIFrameElement::align() const
194 {
195     return getAttribute(alignAttr);
196 }
197
198 void HTMLIFrameElement::setAlign(const String &value)
199 {
200     setAttribute(alignAttr, value);
201 }
202
203 String HTMLIFrameElement::height() const
204 {
205     return getAttribute(heightAttr);
206 }
207
208 void HTMLIFrameElement::setHeight(const String &value)
209 {
210     setAttribute(heightAttr, value);
211 }
212
213 String HTMLIFrameElement::src() const
214 {
215     return document()->completeURL(getAttribute(srcAttr));
216 }
217
218 String HTMLIFrameElement::width() const
219 {
220     return getAttribute(widthAttr);
221 }
222
223 void HTMLIFrameElement::setWidth(const String &value)
224 {
225     setAttribute(widthAttr, value);
226 }
227
228 }