a929f0b8697fad443b23fa3729e0a9588ac70069
[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 }
46
47 HTMLIFrameElement::~HTMLIFrameElement()
48 {
49 }
50
51 bool HTMLIFrameElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const
52 {
53     if (attrName == widthAttr || attrName == heightAttr) {
54         result = eUniversal;
55         return false;
56     }
57     
58     if (attrName == alignAttr) {
59         result = eReplaced; // Share with <img> since the alignment behavior is the same.
60         return false;
61     }
62     
63     return HTMLElement::mapToEntry(attrName, result);
64 }
65
66 void HTMLIFrameElement::parseMappedAttribute(MappedAttribute *attr)
67 {
68     if (attr->name() == widthAttr)
69         addCSSLength(attr, CSS_PROP_WIDTH, attr->value());
70     else if (attr->name() == heightAttr)
71         addCSSLength(attr, CSS_PROP_HEIGHT, attr->value());
72     else if (attr->name() == alignAttr)
73         addHTMLAlignment(attr);
74     else if (attr->name() == nameAttr) {
75         String newNameAttr = attr->value();
76         if (inDocument() && document()->isHTMLDocument()) {
77             HTMLDocument *doc = static_cast<HTMLDocument *>(document());
78             doc->removeDocExtraNamedItem(oldNameAttr);
79             doc->addDocExtraNamedItem(newNameAttr);
80         }
81         oldNameAttr = newNameAttr;
82     } else
83         HTMLFrameElement::parseMappedAttribute(attr);
84 }
85
86 void HTMLIFrameElement::insertedIntoDocument()
87 {
88     if (document()->isHTMLDocument()) {
89         HTMLDocument *doc = static_cast<HTMLDocument *>(document());
90         doc->addDocExtraNamedItem(oldNameAttr);
91     }
92
93     HTMLElement::insertedIntoDocument();
94     
95     // Load the frame
96     m_name = getAttribute(nameAttr);
97     if (m_name.isNull())
98         m_name = getAttribute(idAttr);
99     
100     if (Frame* parentFrame = document()->frame()) {
101         m_name = parentFrame->tree()->uniqueChildName(m_name);
102         
103         openURL();
104     }    
105 }
106
107 void HTMLIFrameElement::willRemove()
108 {
109     if (Frame* frame = contentFrame()) {
110         frame->disconnectOwnerElement();
111         frame->frameDetached();
112         ASSERT(!contentFrame());
113     }
114
115     HTMLElement::willRemove();
116 }
117
118 void HTMLIFrameElement::removedFromDocument()
119 {
120     if (document()->isHTMLDocument()) {
121         HTMLDocument *doc = static_cast<HTMLDocument *>(document());
122         doc->removeDocExtraNamedItem(oldNameAttr);
123     }
124
125     HTMLElement::removedFromDocument();
126 }
127
128 bool HTMLIFrameElement::rendererIsNeeded(RenderStyle *style)
129 {
130     // Don't ignore display: none the way frame does.
131     return isURLAllowed(m_URL) && style->display() != NONE;
132 }
133
134 RenderObject *HTMLIFrameElement::createRenderer(RenderArena *arena, RenderStyle *style)
135 {
136     return new (arena) RenderPartObject(this);
137 }
138
139 void HTMLIFrameElement::attach()
140 {
141     HTMLElement::attach();
142
143     RenderPartObject* renderPart = static_cast<RenderPartObject*>(renderer());
144
145     if (renderPart) {        
146         if (!contentFrame())
147             openURL();
148
149         if (contentFrame()) {
150             renderPart->setWidget(contentFrame()->view());
151             renderPart->updateWidget();
152             needWidgetUpdate = false;
153         }
154     }
155 }
156
157 void HTMLIFrameElement::detach()
158 {
159     HTMLElement::detach();
160 }
161
162 void HTMLIFrameElement::recalcStyle( StyleChange ch )
163 {
164     if (needWidgetUpdate) {
165         if (renderer())
166             static_cast<RenderPartObject*>(renderer())->updateWidget();
167         needWidgetUpdate = false;
168     }
169     HTMLElement::recalcStyle( ch );
170 }
171
172 bool HTMLIFrameElement::isURLAttribute(Attribute *attr) const
173 {
174     return attr->name() == srcAttr;
175 }
176
177 String HTMLIFrameElement::align() const
178 {
179     return getAttribute(alignAttr);
180 }
181
182 void HTMLIFrameElement::setAlign(const String &value)
183 {
184     setAttribute(alignAttr, value);
185 }
186
187 String HTMLIFrameElement::height() const
188 {
189     return getAttribute(heightAttr);
190 }
191
192 void HTMLIFrameElement::setHeight(const String &value)
193 {
194     setAttribute(heightAttr, value);
195 }
196
197 String HTMLIFrameElement::width() const
198 {
199     return getAttribute(widthAttr);
200 }
201
202 void HTMLIFrameElement::setWidth(const String &value)
203 {
204     setAttribute(widthAttr, value);
205 }
206
207 }