File indexing completed on 2024-04-28 15:23:32

0001 /*
0002  * This file is part of the DOM implementation for KDE.
0003  *
0004  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
0005  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
0006  *           (C) 2007, 2008 Maks Orlovich (maksim@kde.org)
0007  *
0008  * This library is free software; you can redistribute it and/or
0009  * modify it under the terms of the GNU Library General Public
0010  * License as published by the Free Software Foundation; either
0011  * version 2 of the License, or (at your option) any later version.
0012  *
0013  * This library is distributed in the hope that it will be useful,
0014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0016  * Library General Public License for more details.
0017  *
0018  * You should have received a copy of the GNU Library General Public License
0019  * along with this library; see the file COPYING.LIB.  If not, write to
0020  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0021  * Boston, MA 02110-1301, USA.
0022  *
0023  */
0024 #ifndef HTML_OBJECTIMPL_H
0025 #define HTML_OBJECTIMPL_H
0026 
0027 #include "html_elementimpl.h"
0028 #include "xml/dom_stringimpl.h"
0029 #include <QObject>
0030 #include <QPointer>
0031 #include <QStringList>
0032 #include <QWidget>
0033 
0034 // -------------------------------------------------------------------------
0035 class KHTMLPart;
0036 
0037 namespace DOM
0038 {
0039 
0040 class HTMLFormElementImpl;
0041 class HTMLEmbedElementImpl;
0042 
0043 // Base class of all objects that are displayed as KParts:
0044 // frames, objects, applets, etc.
0045 class HTMLPartContainerElementImpl : public QObject, public HTMLElementImpl
0046 {
0047     Q_OBJECT
0048 public:
0049 
0050     enum DOMChildFrameEvents { DOMCFResizeEvent = 0x3030 };
0051 
0052     HTMLPartContainerElementImpl(DocumentImpl *doc);
0053     ~HTMLPartContainerElementImpl();
0054 
0055     void computeContentIfNeeded();
0056     void setNeedComputeContent();
0057 
0058     void recalcStyle(StyleChange ch) override;
0059     void close() override;
0060 
0061     // These methods will be called to notify the element of
0062     // any progress in loading of the document: setWidgetNotify if the
0063     // KPart was created, and partLoadingErrorNotify when
0064     // there was a problem with creating the part or loading the data
0065     // (hence setWidgetNotify may be followed by partLoadingErrorNotify).
0066     // This class take care of all the memory management, and during
0067     // the setWidgetNotify call, both old (if any) and new widget are alive
0068     // Note: setWidgetNotify may be called with 0...
0069     virtual void setWidgetNotify(QWidget *widget) = 0;
0070     virtual void partLoadingErrorNotify();
0071 
0072     // This is called when a mimetype is discovered, and should return true
0073     // if KHTMLPart should not make a kpart for it, but rather let it be handled directly.
0074     virtual bool mimetypeHandledInternally(const QString &mime);
0075 
0076     bool event(QEvent *e) override;
0077 
0078     // IMPORTANT: you should call this when requesting a URL, to make sure
0079     // that we don't get stale references to iframes or such.
0080     void clearChildWidget();
0081     QWidget *childWidget() const
0082     {
0083         return m_childWidget;
0084     }
0085 
0086     void postResizeEvent();
0087     static void sendPostedResizeEvents();
0088 public Q_SLOTS:
0089     void slotEmitLoadEvent();
0090 private:
0091     friend class ::KHTMLPart;
0092     // This is called by KHTMLPart to notify us of the new widget.
0093     void setWidget(QWidget *widget);
0094 private:
0095     virtual void computeContent() = 0;
0096     bool m_needToComputeContent; // This flag is set to true when
0097     // we may have to load a new KPart, due to
0098     // source changing, etc.
0099     QPointer<QWidget> m_childWidget; // may be deleted by global child widget cleanup on us..
0100 };
0101 
0102 class HTMLObjectBaseElementImpl : public HTMLPartContainerElementImpl
0103 {
0104     Q_OBJECT
0105 public:
0106     HTMLObjectBaseElementImpl(DocumentImpl *doc);
0107 
0108     void parseAttribute(AttributeImpl *attr) override;
0109     void attach() override;
0110     void defaultEventHandler(EventImpl *e) override;
0111 
0112     void setServiceType(const QString &);
0113 
0114     QString url;
0115     QString classId;
0116     QString serviceType;
0117 
0118     bool m_rerender; // This is set to true if a reattach is pending,
0119     // due to a change in how we need to display this...
0120 
0121     bool m_renderAlternative;
0122     bool m_imageLike;
0123 
0124     void insertedIntoDocument() override;
0125     void removedFromDocument() override;
0126     void addId(const DOMString &id) override;
0127     void removeId(const DOMString &id) override;
0128 
0129     HTMLEmbedElementImpl *relevantEmbed();
0130 
0131     void setWidgetNotify(QWidget *widget) override;
0132     void partLoadingErrorNotify() override;
0133     bool mimetypeHandledInternally(const QString &mime) override;
0134 
0135     // This method figures out what to render -- perhaps KPart, perhaps an image, perhaps
0136     // alternative content, and forces a reattach if need be.
0137     void computeContent() override;
0138 
0139     // Ask for a reattach, since we may need a different renderer..
0140     void requestRerender();
0141 
0142     void renderAlternative();
0143 protected Q_SLOTS:
0144     void slotRerender();
0145     void slotPartLoadingErrorNotify();
0146 protected:
0147     DOMString     m_name;
0148 };
0149 
0150 // -------------------------------------------------------------------------
0151 
0152 class HTMLAppletElementImpl : public HTMLObjectBaseElementImpl
0153 {
0154 public:
0155     HTMLAppletElementImpl(DocumentImpl *doc);
0156 
0157     ~HTMLAppletElementImpl();
0158 
0159     Id id() const override;
0160 
0161     void parseAttribute(AttributeImpl *token) override;
0162     void computeContent() override;
0163 protected:
0164     khtml::VAlign valign;
0165 };
0166 
0167 // -------------------------------------------------------------------------
0168 
0169 class HTMLEmbedElementImpl : public HTMLObjectBaseElementImpl
0170 {
0171 public:
0172     HTMLEmbedElementImpl(DocumentImpl *doc);
0173     ~HTMLEmbedElementImpl();
0174 
0175     Id id() const override;
0176 
0177     void parseAttribute(AttributeImpl *attr) override;
0178     void attach() override;
0179     void computeContent() override;
0180 
0181     virtual HTMLEmbedElementImpl *relevantEmbed();
0182 
0183     QString pluginPage;
0184     bool hidden;
0185 };
0186 
0187 // -------------------------------------------------------------------------
0188 
0189 class HTMLObjectElementImpl : public HTMLObjectBaseElementImpl
0190 {
0191 public:
0192     HTMLObjectElementImpl(DocumentImpl *doc);
0193 
0194     ~HTMLObjectElementImpl();
0195 
0196     Id id() const override;
0197 
0198     HTMLFormElementImpl *form() const;
0199 
0200     void parseAttribute(AttributeImpl *token) override;
0201 
0202     void attach() override;
0203 
0204     DocumentImpl *contentDocument() const;
0205 };
0206 
0207 // -------------------------------------------------------------------------
0208 
0209 class HTMLParamElementImpl : public HTMLElementImpl
0210 {
0211     friend class HTMLAppletElementImpl;
0212 public:
0213     HTMLParamElementImpl(DocumentImpl *_doc) : HTMLElementImpl(_doc) {}
0214 
0215     Id id() const override;
0216 
0217     void parseAttribute(AttributeImpl *token) override;
0218 
0219     QString name() const
0220     {
0221         return m_name;
0222     }
0223     QString value() const
0224     {
0225         return m_value;
0226     }
0227 
0228 protected:
0229     QString m_name;
0230     QString m_value;
0231 };
0232 
0233 } // namespace
0234 #endif