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