18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2000 Stefan Schimanski (1Stein@gmx.de)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLPlugInElement.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPropertyNames.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "MappedAttribute.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderWidget.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ScriptController.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Widget.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API)
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "npruntime_impl.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHTMLPlugInElement::HTMLPlugInElement(const QualifiedName& tagName, Document* doc)
485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    : HTMLFrameOwnerElement(tagName, doc)
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API)
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_NPObject(0)
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHTMLPlugInElement::~HTMLPlugInElement()
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!m_instance); // cleared in detach()
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_NPObject) {
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _NPN_ReleaseObject(m_NPObject);
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_NPObject = 0;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLPlugInElement::detach()
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_instance.clear();
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLFrameOwnerElement::detach();
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPassScriptInstance HTMLPlugInElement::getInstance() const
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = document()->frame();
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the host dynamically turns off JavaScript (or Java) we will still return
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the cached allocated Bindings::Instance.  Not supporting this edge-case is OK.
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_instance)
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return m_instance;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderWidget* renderWidget = renderWidgetForJSBindings();
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (renderWidget && renderWidget->widget())
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_instance = frame->script()->createScriptInstanceForWidget(renderWidget->widget());
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_instance;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLPlugInElement::height() const
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(heightAttr);
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLPlugInElement::setHeight(const String& value)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(heightAttr, value);
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLPlugInElement::width() const
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(widthAttr);
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLPlugInElement::setWidth(const String& value)
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(widthAttr, value);
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool HTMLPlugInElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attrName == widthAttr ||
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        attrName == heightAttr ||
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        attrName == vspaceAttr ||
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        attrName == hspaceAttr) {
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = eUniversal;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attrName == alignAttr) {
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = eReplaced; // Share with <img> since the alignment behavior is the same.
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return HTMLFrameOwnerElement::mapToEntry(attrName, result);
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLPlugInElement::parseMappedAttribute(MappedAttribute* attr)
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attr->name() == widthAttr)
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addCSSLength(attr, CSSPropertyWidth, attr->value());
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == heightAttr)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addCSSLength(attr, CSSPropertyHeight, attr->value());
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == vspaceAttr) {
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addCSSLength(attr, CSSPropertyMarginTop, attr->value());
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addCSSLength(attr, CSSPropertyMarginBottom, attr->value());
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (attr->name() == hspaceAttr) {
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addCSSLength(attr, CSSPropertyMarginLeft, attr->value());
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addCSSLength(attr, CSSPropertyMarginRight, attr->value());
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (attr->name() == alignAttr)
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addHTMLAlignment(attr);
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HTMLFrameOwnerElement::parseMappedAttribute(attr);
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool HTMLPlugInElement::checkDTD(const Node* newChild)
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return newChild->hasTagName(paramTag) || HTMLFrameOwnerElement::checkDTD(newChild);
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLPlugInElement::defaultEventHandler(Event* event)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* r = renderer();
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!r || !r->isWidget())
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Widget* widget = toRenderWidget(r)->widget();
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!widget)
1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    widget->handleEvent(event);
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API)
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNPObject* HTMLPlugInElement::getNPObject()
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(document()->frame());
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_NPObject)
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_NPObject = document()->frame()->script()->createScriptObjectForPluginElement(this);
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_NPObject;
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif /* ENABLE(NETSCAPE_PLUGIN_API) */
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLPlugInElement::updateWidgetCallback(Node* n)
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static_cast<HTMLPlugInElement*>(n)->updateWidget();
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
180a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba#if PLATFORM(ANDROID)
181a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Klobabool HTMLPlugInElement::supportsFocus() const
182a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba{
183a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba    return true;
184a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba}
185a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba#endif
186a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
188