LayoutTests:
[WebKit-https.git] / WebCore / html / HTMLEmbedElement.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 Stefan Schimanski (1Stein@gmx.de)
7  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
8  * Copyright (C) 2007 Trolltech ASA
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 "HTMLEmbedElement.h"
27
28 #include "CSSPropertyNames.h"
29 #include "Frame.h"
30 #include "FrameView.h"
31 #include "HTMLDocument.h"
32 #include "HTMLNames.h"
33 #include "csshelper.h"
34 #include "RenderPartObject.h"
35
36 #if ENABLE(SVG)
37 #include "ExceptionCode.h"
38 #include "SVGDocument.h"
39 #endif
40
41 namespace WebCore {
42
43 using namespace HTMLNames;
44
45 HTMLEmbedElement::HTMLEmbedElement(Document* doc)
46     : HTMLPlugInElement(embedTag, doc)
47 {
48 }
49
50 HTMLEmbedElement::~HTMLEmbedElement()
51 {
52 #if USE(JAVASCRIPTCORE_BINDINGS)
53     // m_instance should have been cleaned up in detach().
54     ASSERT(!m_instance);
55 #endif
56 }
57
58 #if USE(JAVASCRIPTCORE_BINDINGS)
59 KJS::Bindings::Instance *HTMLEmbedElement::getInstance() const
60 {
61     Frame* frame = document()->frame();
62     if (!frame)
63         return 0;
64
65     if (m_instance)
66         return m_instance.get();
67     
68     RenderObject *r = renderer();
69     if (!r) {
70         Node *p = parentNode();
71         
72         while (p) {
73             if (p->hasTagName(objectTag)) {
74                 r = p->renderer();
75                 break;
76             }
77             
78             p = p->parentNode();
79         }
80     }
81
82     if (r && r->isWidget()) {
83         if (Widget* widget = static_cast<RenderWidget*>(r)->widget()) 
84             m_instance = frame->createScriptInstanceForWidget(widget);
85     }
86     return m_instance.get();
87 }
88 #endif
89
90 bool HTMLEmbedElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const
91 {
92     if (attrName == hiddenAttr) {
93         result = eUniversal;
94         return false;
95     }
96         
97     return HTMLPlugInElement::mapToEntry(attrName, result);
98 }
99
100 void HTMLEmbedElement::parseMappedAttribute(MappedAttribute* attr)
101 {
102     String val = attr->value();
103   
104     if (attr->name() == typeAttr) {
105         m_serviceType = val.lower();
106         int pos = m_serviceType.find(";");
107         if (pos != -1)
108             m_serviceType = m_serviceType.left(pos);
109     } else if (attr->name() == codeAttr || attr->name() == srcAttr)
110          url = parseURL(val).deprecatedString();
111     else if (attr->name() == pluginpageAttr || attr->name() == pluginspageAttr)
112         m_pluginPage = val;
113     else if (attr->name() == hiddenAttr) {
114         if (val.lower() == "yes" || val.lower() == "true") {
115             // FIXME: Not dynamic, but it's not really important that such a rarely-used
116             // feature work dynamically.
117             addCSSLength(attr, CSS_PROP_WIDTH, "0");
118             addCSSLength(attr, CSS_PROP_HEIGHT, "0");
119         }
120     } else if (attr->name() == nameAttr) {
121         if (inDocument() && document()->isHTMLDocument()) {
122             HTMLDocument* doc = static_cast<HTMLDocument*>(document());
123             doc->removeNamedItem(oldNameAttr);
124             doc->addNamedItem(val);
125         }
126         oldNameAttr = val;
127     } else
128         HTMLPlugInElement::parseMappedAttribute(attr);
129 }
130
131 bool HTMLEmbedElement::rendererIsNeeded(RenderStyle *style)
132 {
133     Frame *frame = document()->frame();
134     if (!frame)
135         return false;
136
137     Node *p = parentNode();
138     if (p && p->hasTagName(objectTag)) {
139         ASSERT(p->renderer());
140         return false;
141     }
142
143     return true;
144 }
145
146 RenderObject *HTMLEmbedElement::createRenderer(RenderArena *arena, RenderStyle *style)
147 {
148     return new (arena) RenderPartObject(this);
149 }
150
151 void HTMLEmbedElement::attach()
152 {
153     HTMLPlugInElement::attach();
154
155     if (renderer())
156         static_cast<RenderPartObject*>(renderer())->updateWidget();
157 }
158
159 void HTMLEmbedElement::detach()
160 {
161 #if USE(JAVASCRIPTCORE_BINDINGS)
162     m_instance = 0;
163 #endif
164     HTMLPlugInElement::detach();
165 }
166
167 void HTMLEmbedElement::insertedIntoDocument()
168 {
169     if (document()->isHTMLDocument()) {
170         HTMLDocument *doc = static_cast<HTMLDocument *>(document());
171         doc->addNamedItem(oldNameAttr);
172     }
173
174     HTMLPlugInElement::insertedIntoDocument();
175 }
176
177 void HTMLEmbedElement::removedFromDocument()
178 {
179     if (document()->isHTMLDocument()) {
180         HTMLDocument *doc = static_cast<HTMLDocument *>(document());
181         doc->removeNamedItem(oldNameAttr);
182     }
183
184     HTMLPlugInElement::removedFromDocument();
185 }
186
187 bool HTMLEmbedElement::isURLAttribute(Attribute *attr) const
188 {
189     return attr->name() == srcAttr;
190 }
191
192 String HTMLEmbedElement::src() const
193 {
194     return getAttribute(srcAttr);
195 }
196
197 void HTMLEmbedElement::setSrc(const String& value)
198 {
199     setAttribute(srcAttr, value);
200 }
201
202 String HTMLEmbedElement::type() const
203 {
204     return getAttribute(typeAttr);
205 }
206
207 void HTMLEmbedElement::setType(const String& value)
208 {
209     setAttribute(typeAttr, value);
210 }
211
212 #if ENABLE(SVG)
213 SVGDocument* HTMLEmbedElement::getSVGDocument(ExceptionCode& ec) const
214 {
215     Document* doc = contentDocument();
216     if (doc && doc->isSVGDocument())
217         return static_cast<SVGDocument*>(doc);
218     // Spec: http://www.w3.org/TR/SVG/struct.html#InterfaceGetSVGDocument
219     ec = NOT_SUPPORTED_ERR;
220     return 0;
221 }
222 #endif
223
224 }