Fix 64-bit build.
[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 "JSNode.h"
34 #include "Page.h"
35 #include "RenderWidget.h"
36 #include "Settings.h"
37 #include "Widget.h"
38 #include "kjs_proxy.h"
39
40 #if USE(JAVASCRIPTCORE_BINDINGS)
41 #include <bindings/runtime.h>
42 #endif
43
44 #if USE(NPOBJECT)
45 #include <bindings/NP_jsobject.h>
46 #include <bindings/npruntime_impl.h>
47 #include <bindings/runtime_root.h>
48 #endif
49
50 using KJS::ExecState;
51 using KJS::JSLock;
52 using KJS::JSValue;
53 using KJS::Bindings::RootObject;
54
55 namespace WebCore {
56
57 using namespace HTMLNames;
58
59 HTMLPlugInElement::HTMLPlugInElement(const QualifiedName& tagName, Document* doc)
60     : HTMLFrameOwnerElement(tagName, doc)
61 #if USE(NPOBJECT)
62     , m_NPObject(0)
63 #endif
64 {
65 }
66
67 HTMLPlugInElement::~HTMLPlugInElement()
68 {
69 #if USE(NPOBJECT)
70     if (m_NPObject) {
71         _NPN_ReleaseObject(m_NPObject);
72         m_NPObject = 0;
73     }
74 #endif
75 }
76
77 String HTMLPlugInElement::align() const
78 {
79     return getAttribute(alignAttr);
80 }
81
82 void HTMLPlugInElement::setAlign(const String& value)
83 {
84     setAttribute(alignAttr, value);
85 }
86
87 String HTMLPlugInElement::height() const
88 {
89     return getAttribute(heightAttr);
90 }
91
92 void HTMLPlugInElement::setHeight(const String& value)
93 {
94     setAttribute(heightAttr, value);
95 }
96
97 String HTMLPlugInElement::name() const
98 {
99     return getAttribute(nameAttr);
100 }
101
102 void HTMLPlugInElement::setName(const String& value)
103 {
104     setAttribute(nameAttr, value);
105 }
106
107 String HTMLPlugInElement::width() const
108 {
109     return getAttribute(widthAttr);
110 }
111
112 void HTMLPlugInElement::setWidth(const String& value)
113 {
114     setAttribute(widthAttr, value);
115 }
116
117 bool HTMLPlugInElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const
118 {
119     if (attrName == widthAttr ||
120         attrName == heightAttr ||
121         attrName == vspaceAttr ||
122         attrName == hspaceAttr) {
123             result = eUniversal;
124             return false;
125     }
126     
127     if (attrName == alignAttr) {
128         result = eReplaced; // Share with <img> since the alignment behavior is the same.
129         return false;
130     }
131     
132     return HTMLFrameOwnerElement::mapToEntry(attrName, result);
133 }
134
135 void HTMLPlugInElement::parseMappedAttribute(MappedAttribute* attr)
136 {
137     if (attr->name() == widthAttr)
138         addCSSLength(attr, CSS_PROP_WIDTH, attr->value());
139     else if (attr->name() == heightAttr)
140         addCSSLength(attr, CSS_PROP_HEIGHT, attr->value());
141     else if (attr->name() == vspaceAttr) {
142         addCSSLength(attr, CSS_PROP_MARGIN_TOP, attr->value());
143         addCSSLength(attr, CSS_PROP_MARGIN_BOTTOM, attr->value());
144     } else if (attr->name() == hspaceAttr) {
145         addCSSLength(attr, CSS_PROP_MARGIN_LEFT, attr->value());
146         addCSSLength(attr, CSS_PROP_MARGIN_RIGHT, attr->value());
147     } else if (attr->name() == alignAttr)
148         addHTMLAlignment(attr);
149     else
150         HTMLFrameOwnerElement::parseMappedAttribute(attr);
151 }    
152
153 bool HTMLPlugInElement::checkDTD(const Node* newChild)
154 {
155     return newChild->hasTagName(paramTag) || HTMLFrameOwnerElement::checkDTD(newChild);
156 }
157
158 void HTMLPlugInElement::defaultEventHandler(Event* event)
159 {
160     RenderObject* r = renderer();
161     if (!r || !r->isWidget())
162         return;
163
164     if (Widget* widget = static_cast<RenderWidget*>(r)->widget())
165         widget->handleEvent(event);
166 }
167
168 #if USE(NPOBJECT)
169
170 NPObject* HTMLPlugInElement::createNPObject()
171 {
172     Frame* frame = document()->frame();
173     if (!frame) {
174         // This shouldn't ever happen, but might as well check anyway.
175         ASSERT_NOT_REACHED();
176         return _NPN_CreateNoScriptObject();
177     }
178
179     Settings* settings = frame->settings();
180     if (!settings) {
181         // This shouldn't ever happen, but might as well check anyway.
182         ASSERT_NOT_REACHED();
183         return _NPN_CreateNoScriptObject();
184     }
185
186     // Can't create NPObjects when JavaScript is disabled
187     if (!frame->scriptProxy()->isEnabled())
188         return _NPN_CreateNoScriptObject();
189     
190     // Create a JSObject bound to this element
191     JSLock lock;
192     ExecState *exec = frame->scriptProxy()->globalObject()->globalExec();
193     JSValue* jsElementValue = toJS(exec, this);
194     if (!jsElementValue || !jsElementValue->isObject())
195         return _NPN_CreateNoScriptObject();
196
197     // Wrap the JSObject in an NPObject
198     RootObject* rootObject = frame->bindingRootObject();
199     return _NPN_CreateScriptObject(0, jsElementValue->getObject(), rootObject);
200 }
201
202 NPObject* HTMLPlugInElement::getNPObject()
203 {
204     if (!m_NPObject)
205         m_NPObject = createNPObject();
206     return m_NPObject;
207 }
208
209 #endif /* USE(NPOBJECT) */
210
211 void HTMLPlugInElement::updateWidgetCallback(Node* n)
212 {
213     static_cast<HTMLPlugInElement*>(n)->updateWidget();
214 }
215
216 }