JavaScriptCore:
[WebKit-https.git] / WebCore / html / HTMLPlugInElement.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  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  */
24 #include "config.h"
25 #include "HTMLPlugInElement.h"
26
27 #include "CSSPropertyNames.h"
28 #include "Document.h"
29 #include "Frame.h"
30 #include "FrameLoader.h"
31 #include "FrameTree.h"
32 #include "HTMLNames.h"
33 #include "Page.h"
34 #include "RenderWidget.h"
35 #include "Settings.h"
36 #include "Widget.h"
37 #include "kjs_dom.h"
38 #include "kjs_proxy.h"
39
40 #if USE(NPOBJECT)
41 #include <bindings/NP_jsobject.h>
42 #include <bindings/npruntime_impl.h>
43 #include <bindings/runtime_root.h>
44 #endif
45
46 using KJS::ExecState;
47 using KJS::JSLock;
48 using KJS::JSValue;
49 using KJS::Bindings::RootObject;
50
51 namespace WebCore {
52
53 using namespace HTMLNames;
54
55 HTMLPlugInElement::HTMLPlugInElement(const QualifiedName& tagName, Document* doc)
56     : HTMLFrameOwnerElement(tagName, doc)
57 #if USE(NPOBJECT)
58     , m_NPObject(0)
59 #endif
60 {
61 }
62
63 HTMLPlugInElement::~HTMLPlugInElement()
64 {
65 #if USE(NPOBJECT)
66     if (m_NPObject) {
67         _NPN_ReleaseObject(m_NPObject);
68         m_NPObject = 0;
69     }
70 #endif
71 }
72
73 String HTMLPlugInElement::align() const
74 {
75     return getAttribute(alignAttr);
76 }
77
78 void HTMLPlugInElement::setAlign(const String& value)
79 {
80     setAttribute(alignAttr, value);
81 }
82
83 String HTMLPlugInElement::height() const
84 {
85     return getAttribute(heightAttr);
86 }
87
88 void HTMLPlugInElement::setHeight(const String& value)
89 {
90     setAttribute(heightAttr, value);
91 }
92
93 String HTMLPlugInElement::name() const
94 {
95     return getAttribute(nameAttr);
96 }
97
98 void HTMLPlugInElement::setName(const String& value)
99 {
100     setAttribute(nameAttr, value);
101 }
102
103 String HTMLPlugInElement::width() const
104 {
105     return getAttribute(widthAttr);
106 }
107
108 void HTMLPlugInElement::setWidth(const String& value)
109 {
110     setAttribute(widthAttr, value);
111 }
112
113 bool HTMLPlugInElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const
114 {
115     if (attrName == widthAttr ||
116         attrName == heightAttr ||
117         attrName == vspaceAttr ||
118         attrName == hspaceAttr) {
119             result = eUniversal;
120             return false;
121     }
122     
123     if (attrName == alignAttr) {
124         result = eReplaced; // Share with <img> since the alignment behavior is the same.
125         return false;
126     }
127     
128     return HTMLFrameOwnerElement::mapToEntry(attrName, result);
129 }
130
131 void HTMLPlugInElement::parseMappedAttribute(MappedAttribute* attr)
132 {
133     if (attr->name() == widthAttr)
134         addCSSLength(attr, CSS_PROP_WIDTH, attr->value());
135     else if (attr->name() == heightAttr)
136         addCSSLength(attr, CSS_PROP_HEIGHT, attr->value());
137     else if (attr->name() == vspaceAttr) {
138         addCSSLength(attr, CSS_PROP_MARGIN_TOP, attr->value());
139         addCSSLength(attr, CSS_PROP_MARGIN_BOTTOM, attr->value());
140     } else if (attr->name() == hspaceAttr) {
141         addCSSLength(attr, CSS_PROP_MARGIN_LEFT, attr->value());
142         addCSSLength(attr, CSS_PROP_MARGIN_RIGHT, attr->value());
143     } else if (attr->name() == alignAttr)
144         addHTMLAlignment(attr);
145     else
146         HTMLFrameOwnerElement::parseMappedAttribute(attr);
147 }    
148
149 bool HTMLPlugInElement::checkDTD(const Node* newChild)
150 {
151     return newChild->hasTagName(paramTag) || HTMLFrameOwnerElement::checkDTD(newChild);
152 }
153
154 void HTMLPlugInElement::defaultEventHandler(Event* event)
155 {
156     RenderObject* r = renderer();
157     if (!r || !r->isWidget())
158         return;
159
160     if (Widget* widget = static_cast<RenderWidget*>(r)->widget())
161         widget->handleEvent(event);
162 }
163
164 #if USE(NPOBJECT)
165
166 NPObject* HTMLPlugInElement::createNPObject()
167 {
168     Frame* frame = document()->frame();
169     if (!frame) {
170         // This shouldn't ever happen, but might as well check anyway.
171         ASSERT_NOT_REACHED();
172         return _NPN_CreateNoScriptObject();
173     }
174
175     Settings* settings = frame->settings();
176     if (!settings) {
177         // This shouldn't ever happen, but might as well check anyway.
178         ASSERT_NOT_REACHED();
179         return _NPN_CreateNoScriptObject();
180     }
181
182     // Can't create NPObjects when JavaScript is disabled
183     if (!settings->isJavaScriptEnabled())
184         return _NPN_CreateNoScriptObject();
185     
186     // Create a JSObject bound to this element
187     JSLock lock;
188     ExecState *exec = frame->scriptProxy()->globalObject()->globalExec();
189     JSValue* jsElementValue = toJS(exec, this);
190     if (!jsElementValue || !jsElementValue->isObject())
191         return _NPN_CreateNoScriptObject();
192
193     // Wrap the JSObject in an NPObject
194     RootObject* rootObject = frame->bindingRootObject();
195     return _NPN_CreateScriptObject(0, jsElementValue->getObject(), rootObject);
196 }
197
198 NPObject* HTMLPlugInElement::getNPObject()
199 {
200     if (!m_NPObject)
201         m_NPObject = createNPObject();
202     return m_NPObject;
203 }
204
205 #endif /* USE(NPOBJECT) */
206
207 void HTMLPlugInElement::updateWidgetCallback(Node* n)
208 {
209     static_cast<HTMLPlugInElement*>(n)->updateWidget();
210 }
211
212 }