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) 2007, 2008 Maks Orlovich (maksim@kde.org) 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Library General Public 10 * License as published by the Free Software Foundation; either 11 * version 2 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Library General Public License for more details. 17 * 18 * You should have received a copy of the GNU Library General Public License 19 * along with this library; see the file COPYING.LIB. If not, write to 20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 * Boston, MA 02110-1301, USA. 22 * 23 */ 24 #ifndef HTML_OBJECTIMPL_H 25 #define HTML_OBJECTIMPL_H 26 27 #include "html_elementimpl.h" 28 #include "xml/dom_stringimpl.h" 29 #include <QObject> 30 #include <QPointer> 31 #include <QStringList> 32 #include <QWidget> 33 34 // ------------------------------------------------------------------------- 35 class KHTMLPart; 36 37 namespace DOM 38 { 39 40 class HTMLFormElementImpl; 41 class HTMLEmbedElementImpl; 42 43 // Base class of all objects that are displayed as KParts: 44 // frames, objects, applets, etc. 45 class HTMLPartContainerElementImpl : public QObject, public HTMLElementImpl 46 { 47 Q_OBJECT 48 public: 49 50 enum DOMChildFrameEvents { DOMCFResizeEvent = 0x3030 }; 51 52 HTMLPartContainerElementImpl(DocumentImpl *doc); 53 ~HTMLPartContainerElementImpl(); 54 55 void computeContentIfNeeded(); 56 void setNeedComputeContent(); 57 58 void recalcStyle(StyleChange ch) override; 59 void close() override; 60 61 // These methods will be called to notify the element of 62 // any progress in loading of the document: setWidgetNotify if the 63 // KPart was created, and partLoadingErrorNotify when 64 // there was a problem with creating the part or loading the data 65 // (hence setWidgetNotify may be followed by partLoadingErrorNotify). 66 // This class take care of all the memory management, and during 67 // the setWidgetNotify call, both old (if any) and new widget are alive 68 // Note: setWidgetNotify may be called with 0... 69 virtual void setWidgetNotify(QWidget *widget) = 0; 70 virtual void partLoadingErrorNotify(); 71 72 // This is called when a mimetype is discovered, and should return true 73 // if KHTMLPart should not make a kpart for it, but rather let it be handled directly. 74 virtual bool mimetypeHandledInternally(const QString &mime); 75 76 bool event(QEvent *e) override; 77 78 // IMPORTANT: you should call this when requesting a URL, to make sure 79 // that we don't get stale references to iframes or such. 80 void clearChildWidget(); childWidget()81 QWidget *childWidget() const 82 { 83 return m_childWidget; 84 } 85 86 void postResizeEvent(); 87 static void sendPostedResizeEvents(); 88 public Q_SLOTS: 89 void slotEmitLoadEvent(); 90 private: 91 friend class ::KHTMLPart; 92 // This is called by KHTMLPart to notify us of the new widget. 93 void setWidget(QWidget *widget); 94 private: 95 virtual void computeContent() = 0; 96 bool m_needToComputeContent; // This flag is set to true when 97 // we may have to load a new KPart, due to 98 // source changing, etc. 99 QPointer<QWidget> m_childWidget; // may be deleted by global child widget cleanup on us.. 100 }; 101 102 class HTMLObjectBaseElementImpl : public HTMLPartContainerElementImpl 103 { 104 Q_OBJECT 105 public: 106 HTMLObjectBaseElementImpl(DocumentImpl *doc); 107 108 void parseAttribute(AttributeImpl *attr) override; 109 void attach() override; 110 void defaultEventHandler(EventImpl *e) override; 111 112 void setServiceType(const QString &); 113 114 QString url; 115 QString classId; 116 QString serviceType; 117 118 bool m_rerender; // This is set to true if a reattach is pending, 119 // due to a change in how we need to display this... 120 121 bool m_renderAlternative; 122 bool m_imageLike; 123 124 void insertedIntoDocument() override; 125 void removedFromDocument() override; 126 void addId(const DOMString &id) override; 127 void removeId(const DOMString &id) override; 128 129 HTMLEmbedElementImpl *relevantEmbed(); 130 131 void setWidgetNotify(QWidget *widget) override; 132 void partLoadingErrorNotify() override; 133 bool mimetypeHandledInternally(const QString &mime) override; 134 135 // This method figures out what to render -- perhaps KPart, perhaps an image, perhaps 136 // alternative content, and forces a reattach if need be. 137 void computeContent() override; 138 139 // Ask for a reattach, since we may need a different renderer.. 140 void requestRerender(); 141 142 void renderAlternative(); 143 protected Q_SLOTS: 144 void slotRerender(); 145 void slotPartLoadingErrorNotify(); 146 protected: 147 DOMString m_name; 148 }; 149 150 // ------------------------------------------------------------------------- 151 152 class HTMLAppletElementImpl : public HTMLObjectBaseElementImpl 153 { 154 public: 155 HTMLAppletElementImpl(DocumentImpl *doc); 156 157 ~HTMLAppletElementImpl(); 158 159 Id id() const override; 160 161 void parseAttribute(AttributeImpl *token) override; 162 void computeContent() override; 163 protected: 164 khtml::VAlign valign; 165 }; 166 167 // ------------------------------------------------------------------------- 168 169 class HTMLEmbedElementImpl : public HTMLObjectBaseElementImpl 170 { 171 public: 172 HTMLEmbedElementImpl(DocumentImpl *doc); 173 ~HTMLEmbedElementImpl(); 174 175 Id id() const override; 176 177 void parseAttribute(AttributeImpl *attr) override; 178 void attach() override; 179 void computeContent() override; 180 181 virtual HTMLEmbedElementImpl *relevantEmbed(); 182 183 QString pluginPage; 184 bool hidden; 185 }; 186 187 // ------------------------------------------------------------------------- 188 189 class HTMLObjectElementImpl : public HTMLObjectBaseElementImpl 190 { 191 public: 192 HTMLObjectElementImpl(DocumentImpl *doc); 193 194 ~HTMLObjectElementImpl(); 195 196 Id id() const override; 197 198 HTMLFormElementImpl *form() const; 199 200 void parseAttribute(AttributeImpl *token) override; 201 202 void attach() override; 203 204 DocumentImpl *contentDocument() const; 205 }; 206 207 // ------------------------------------------------------------------------- 208 209 class HTMLParamElementImpl : public HTMLElementImpl 210 { 211 friend class HTMLAppletElementImpl; 212 public: HTMLParamElementImpl(DocumentImpl * _doc)213 HTMLParamElementImpl(DocumentImpl *_doc) : HTMLElementImpl(_doc) {} 214 215 Id id() const override; 216 217 void parseAttribute(AttributeImpl *token) override; 218 name()219 QString name() const 220 { 221 return m_name; 222 } value()223 QString value() const 224 { 225 return m_value; 226 } 227 228 protected: 229 QString m_name; 230 QString m_value; 231 }; 232 233 } // namespace 234 #endif 235