1 /*
2  *  This file is part of the KDE libraries
3  *  Copyright (C) 1999 Harri Porten (porten@kde.org)
4  *  Copyright (C) 2003 Apple Computer, Inc.
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Library General Public
8  *  License as published by the Free Software Foundation; either
9  *  version 2 of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Library General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Library General Public
17  *  License along with this library; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20 
21 #ifndef _KJS_HTML_H_
22 #define _KJS_HTML_H_
23 
24 #include "html/html_documentimpl.h"
25 #include "html/html_baseimpl.h"
26 #include "html/html_miscimpl.h"
27 #include "html/html_formimpl.h"
28 #include "misc/loader_client.h"
29 
30 #include "ecma/kjs_binding.h"
31 #include "ecma/kjs_dom.h"
32 #include "ecma/kjs_scriptable.h"
33 #include "xml/dom_nodeimpl.h"  // for NodeImpl::Id
34 
35 namespace KJS
36 {
37 class HTMLElement;
38 class Window;
39 
40 class HTMLDocument : public DOMDocument
41 {
42 public:
43     HTMLDocument(ExecState *exec, DOM::HTMLDocumentImpl *d);
44     JSValue *getValueProperty(ExecState *exec, int token);
45     using KJS::JSObject::getOwnPropertySlot;
46     bool getOwnPropertySlot(ExecState *exec, const Identifier &propertyName, PropertySlot &slot) override;
47     using KJS::JSObject::put;
48     void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None) override;
49     void putValueProperty(ExecState *exec, int token, JSValue *value, int /*attr*/);
50 
classInfo()51     const ClassInfo *classInfo() const override
52     {
53         return &info;
54     }
55     static const ClassInfo info;
56     enum { Referrer, Domain, URL, Body, Location, Cookie,
57            Images, Applets, Links, Forms, Layers, Anchors, Scripts, All, Clear, Open, Close,
58            Write, WriteLn, GetElementsByName, GetSelection, CaptureEvents, ReleaseEvents,
59            BgColor, FgColor, AlinkColor, LinkColor, VlinkColor, LastModified,
60            Height, Width, Dir, Frames, CompatMode, DesignMode, ActiveElement
61          };
impl()62     DOM::HTMLDocumentImpl *impl() const
63     {
64         return static_cast<DOM::HTMLDocumentImpl *>(m_impl.get());
65     }
66 private:
67     static JSValue *nameGetter(ExecState *exec, JSObject *, const Identifier &name, const PropertySlot &slot);
68     static JSValue *frameNameGetter(ExecState *exec, JSObject *, const Identifier &name, const PropertySlot &slot);
69     static JSValue *objectNameGetter(ExecState *exec, JSObject *, const Identifier &name, const PropertySlot &slot);
70     static JSValue *layerNameGetter(ExecState *exec, JSObject *, const Identifier &name, const PropertySlot &slot);
71 };
72 
DEFINE_PSEUDO_CONSTRUCTOR(HTMLDocumentPseudoCtor)73 DEFINE_PSEUDO_CONSTRUCTOR(HTMLDocumentPseudoCtor)
74 
75 class HTMLElement : public DOMElement
76 {
77 public:
78     HTMLElement(ExecState *exec, DOM::HTMLElementImpl *e);
79     using KJS::JSObject::getOwnPropertySlot;
80     bool getOwnPropertySlot(ExecState *exec, const Identifier &propertyName, PropertySlot &slot) override;
81     JSValue *getValueProperty(ExecState *exec, int token) const;
82     using KJS::JSObject::put;
83     void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None) override;
84     void putValueProperty(ExecState *exec, int token, JSValue *value, int);
85     UString toString(ExecState *exec) const override;
86     void pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const override;
87     const ClassInfo *classInfo() const override;
88     static const ClassInfo info;
89 
90     static const ClassInfo html_info, head_info, link_info, title_info,
91            meta_info, base_info, isIndex_info, style_info, body_info, form_info,
92            select_info, optGroup_info, option_info, input_info, textArea_info,
93            button_info, label_info, fieldSet_info, legend_info, ul_info, ol_info,
94            dl_info, dir_info, menu_info, li_info, div_info, p_info, heading_info,
95            blockQuote_info, q_info, pre_info, br_info, baseFont_info, font_info,
96            hr_info, mod_info, a_info, canvas_info, img_info, object_info, param_info,
97            applet_info, map_info, area_info, script_info, table_info,
98            caption_info, col_info, tablesection_info, tr_info,
99            tablecell_info, frameSet_info, frame_info, iFrame_info, marquee_info, layer_info;
100 
101     enum { HtmlVersion, HeadProfile, LinkHref, LinkRel, LinkMedia,
102            LinkCharset, LinkDisabled, LinkHrefLang, LinkRev, LinkTarget, LinkType,
103            LinkSheet, TitleText, MetaName, MetaHttpEquiv, MetaContent, MetaScheme,
104            BaseHref, BaseTarget, IsIndexForm, IsIndexPrompt, StyleDisabled,
105            StyleSheet, StyleType, StyleMedia, BodyBackground, BodyVLink, BodyText,
106            BodyLink, BodyALink, BodyBgColor, BodyOnLoad, BodyOnBlur, BodyOnFocus,
107            BodyOnError, BodyOnMessage, BodyFocus, BodyOnHashChange,
108            FormAction, FormEncType, FormElements, FormLength, FormAcceptCharset,
109            FormReset, FormTarget, FormName, FormMethod, FormSubmit, SelectAdd,
110            SelectValue, SelectSelectedIndex, SelectLength,
111            SelectRemove, SelectForm, SelectType, SelectOptions,
112            SelectDisabled, SelectMultiple, SelectName, SelectSize, SelectItem,
113            OptGroupDisabled, OptGroupLabel, OptionIndex, OptionSelected,
114            OptionForm, OptionText, OptionDefaultSelected, OptionDisabled,
115            OptionLabel, OptionValue, InputReadOnly, InputAccept,
116            InputSize, InputDefaultValue, InputValue, InputType,
117            InputMaxLength, InputDefaultChecked, InputDisabled,
118            InputChecked, InputIndeterminate, InputForm, InputAccessKey, InputAlign, InputAlt,
119            InputName, InputSrc, InputUseMap, InputSelect, InputClick,
120            InputSelectionStart, InputSelectionEnd, InputSetSelectionRange, InputPlaceholder,
121            TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect,
122            TextAreaCols, TextAreaDisabled, TextAreaForm, TextAreaType,
123            TextAreaReadOnly, TextAreaRows, TextAreaValue,
124            TextAreaSelectionStart, TextAreaSelectionEnd, TextAreaSetSelectionRange,
125            TextAreaTextLength,  TextAreaPlaceholder,
126            ButtonClick, ButtonForm, ButtonName,
127            ButtonDisabled, ButtonAccessKey, ButtonType, ButtonValue, LabelHtmlFor,
128            LabelForm, LabelAccessKey, FieldSetForm, LegendForm, LegendAccessKey,
129            LegendAlign, UListType, UListCompact, OListStart, OListCompact,
130            OListType, DListCompact, DirectoryCompact, MenuCompact, LIType,
131            LIValue, DivAlign, ParagraphAlign, HeadingAlign, BlockQuoteCite,
132            QuoteCite, PreWidth, BRClear, BaseFontColor, BaseFontSize,
133            BaseFontFace, FontColor, FontSize, FontFace, HRWidth, HRNoShade,
134            HRAlign, HRSize, ModCite, ModDateTime, AnchorShape, AnchorRel,
135            AnchorAccessKey, AnchorCoords, AnchorHref, AnchorProtocol, AnchorHost,
136            AnchorCharset, AnchorHrefLang, AnchorHostname, AnchorType,
137            AnchorPort, AnchorPathName, AnchorHash, AnchorSearch, AnchorName,
138            AnchorRev, AnchorTarget, AnchorText, AnchorClick, AnchorToString,
139            ImageName, ImageAlign, ImageHspace, ImageVspace, ImageUseMap, ImageAlt,
140            ImageLowSrc, ImageWidth, ImageIsMap, ImageBorder, ImageHeight,
141            ImageLongDesc, ImageSrc, ImageX, ImageY, ImageComplete, ObjectHspace, ObjectHeight, ObjectAlign,
142            ObjectBorder, ObjectCode, ObjectType, ObjectVspace, ObjectArchive,
143            ObjectDeclare, ObjectForm, ObjectCodeBase, ObjectCodeType, ObjectData, ObjectGetSVGDocument,
144            ObjectName, ObjectStandby, ObjectUseMap, ObjectWidth, ObjectContentDocument,
145            ParamName, ParamType, ParamValueType, ParamValue, AppletArchive,
146            AppletAlt, AppletCode, AppletWidth, AppletAlign, AppletCodeBase,
147            AppletName, AppletHeight, AppletHspace, AppletObject, AppletVspace,
148            MapAreas, MapName, AreaHash, AreaHref, AreaTarget, AreaPort, AreaShape,
149            AreaCoords, AreaAlt, AreaAccessKey, AreaNoHref, AreaHost, AreaProtocol,
150            AreaHostName, AreaPathName, AreaSearch, ScriptEvent,
151            ScriptType, ScriptHtmlFor, ScriptText, ScriptSrc, ScriptCharset,
152            ScriptDefer, TableSummary, TableTBodies, TableTHead, TableCellPadding,
153            TableDeleteCaption, TableCreateCaption, TableCaption, TableWidth,
154            TableCreateTFoot, TableAlign, TableTFoot, TableDeleteRow,
155            TableCellSpacing, TableRows, TableBgColor, TableBorder, TableFrame,
156            TableRules, TableCreateTHead, TableDeleteTHead, TableDeleteTFoot,
157            TableInsertRow, TableCaptionAlign, TableColCh, TableColChOff,
158            TableColAlign, TableColSpan, TableColVAlign, TableColWidth,
159            TableSectionCh, TableSectionDeleteRow, TableSectionChOff,
160            TableSectionRows, TableSectionAlign, TableSectionVAlign,
161            TableSectionInsertRow, TableRowSectionRowIndex, TableRowRowIndex,
162            TableRowChOff, TableRowCells, TableRowVAlign, TableRowCh,
163            TableRowAlign, TableRowBgColor, TableRowDeleteCell, TableRowInsertCell,
164            TableCellColSpan, TableCellNoWrap, TableCellAbbr, TableCellHeight,
165            TableCellWidth, TableCellCellIndex, TableCellChOff, TableCellBgColor,
166            TableCellCh, TableCellVAlign, TableCellRowSpan, TableCellHeaders,
167            TableCellAlign, TableCellAxis, TableCellScope, FrameSetCols,
168            FrameSetRows, FrameSetOnMessage, FrameSrc, FrameLocation, FrameFrameBorder, FrameScrolling,
169            FrameMarginWidth, FrameLongDesc, FrameMarginHeight, FrameName,
170            FrameContentDocument, FrameContentWindow,
171            FrameNoResize, FrameWidth, FrameHeight, IFrameLongDesc, IFrameAlign,
172            IFrameFrameBorder, IFrameSrc, IFrameName, IFrameHeight,
173            IFrameMarginHeight, IFrameMarginWidth, IFrameScrolling, IFrameWidth,
174            IFrameContentDocument, IFrameContentWindow, IFrameGetSVGDocument,
175            MarqueeStart, MarqueeStop,
176            CanvasGetContext, CanvasWidth, CanvasHeight, CanvasToDataURL,
177            LayerTop, LayerLeft, LayerVisibility, LayerBgColor, LayerClip, LayerDocument, LayerLayers,
178            ElementInnerHTML, ElementTitle, ElementId, ElementDir, ElementLang,
179            ElementClassName, ElementInnerText, ElementDocument,
180            ElementChildren, ElementContentEditable, ElementIsContentEditable,
181            ElementAll, ElementScrollIntoView, ElementTabIndex
182          };
183 
184     DOM::HTMLElementImpl *impl() const
185     {
186         return static_cast<DOM::HTMLElementImpl *>(m_impl.get());
187     }
188     JSValue *indexGetter(ExecState *exec, unsigned index);
189 private:
190     static JSValue *formNameGetter(ExecState *exec, JSObject *, const Identifier &name, const PropertySlot &slot);
191 
192     QString getURLArg(unsigned id) const;
193 
194     static KParts::ScriptableExtension *getScriptableExtension(const DOM::HTMLElementImpl &element);
195 
196     /* Many of properties in the DOM bindings can be implemented by merely returning
197       an attribute as the right type, and setting it in similar manner; or perhaps
198       returning a collection of appropriate type*/
199     enum BoundPropType {
200         T_String, //String, to be return by String()
201         T_StrOrNl, //String, to be return by getStringOrNull()
202         T_Bool,   //Boolean, return true if property is not null
203         T_Int,
204         T_URL,
205         T_Res,      //Reserved, ignore sets, return empty string
206         T_Coll,     //Collection, type is in attrID
207         T_ReadOnly = 0x80 //Property should be handled only on read.
208     };
209 
210     enum {
211         NotApplicable = 0xFFFFFFFu
212     };
213 
214     struct BoundPropInfo {
215         unsigned elId;  //Applicable element type
216         int      token; //Token
217         BoundPropType type;
218         unsigned attrId; //Attribute to get
219     };
220 
221     JSValue *handleBoundRead(ExecState *exec, int token) const;
222     bool      handleBoundWrite(ExecState *exec, int token, JSValue *value);
223 
224     static const BoundPropInfo bpTable[];
225 
226     static QHash<int, const BoundPropInfo *> *s_boundPropInfo;
227     static QHash<int, const BoundPropInfo *> *boundPropInfo();
228 
229     // returns our window object --- may return 0.
230     KJS::Window *ourWindow() const;
231     JSValue     *getWindowListener(ExecState *exec, int eventId) const;
232     void         setWindowListener(ExecState *exec, int eventId, JSValue *val) const;
233 };
234 
235 class HTMLCollection : public DOMObject
236 {
237 public:
238     HTMLCollection(ExecState *exec,  DOM::HTMLCollectionImpl *c);
239     HTMLCollection(KJS::JSObject *proto, DOM::HTMLCollectionImpl *c);
240     ~HTMLCollection();
241     JSValue *getValueProperty(ExecState *exec, int token);
242     using KJS::JSObject::getOwnPropertySlot;
243     bool getOwnPropertySlot(ExecState *exec, const Identifier &propertyName, PropertySlot &slot) override;
244 
245     JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List &args) override;
implementsCall()246     bool implementsCall() const override
247     {
248         return true;
249     }
isFunctionType()250     bool isFunctionType() const override
251     {
252         return false;
253     }
254     bool masqueradeAsUndefined() const override;
255     bool toBoolean(ExecState *) const override;
256     void getOwnPropertyNames(ExecState *, PropertyNameArray &, PropertyMap::PropertyMode mode) override;
257     enum { Item, NamedItem, Tags };
258     JSValue *getNamedItems(ExecState *exec, const Identifier &propertyName) const;
classInfo()259     const ClassInfo *classInfo() const override
260     {
261         return &info;
262     }
263     static const ClassInfo info;
impl()264     DOM::HTMLCollectionImpl *impl() const
265     {
266         return m_impl.get();
267     }
hide()268     virtual void hide()
269     {
270         hidden = true;
271     }
272     JSValue *indexGetter(ExecState *exec, unsigned index);
273 protected:
274     SharedPtr<DOM::HTMLCollectionImpl> m_impl;
275     bool hidden;
276 private:
277     static JSValue *lengthGetter(ExecState *exec, JSObject *, const Identifier &name, const PropertySlot &slot);
278     static JSValue *nameGetter(ExecState *exec, JSObject *, const Identifier &name, const PropertySlot &slot);
279 };
280 
281 class HTMLSelectCollection : public HTMLCollection
282 {
283 public:
284     enum { Add, Remove };
285     HTMLSelectCollection(ExecState *exec, DOM::HTMLCollectionImpl *c, DOM::HTMLSelectElementImpl *e);
286     using KJS::JSObject::getOwnPropertySlot;
287     bool getOwnPropertySlot(ExecState *exec, const Identifier &propertyName, PropertySlot &slot) override;
288     using KJS::JSObject::put;
289     void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None) override;
290 
classInfo()291     const ClassInfo *classInfo() const override
292     {
293         return &info;
294     }
295     static const ClassInfo info;
296 
toElement()297     DOM::HTMLSelectElementImpl *toElement() const
298     {
299         return element.get();
300     }
301 private:
302     SharedPtr<DOM::HTMLSelectElementImpl> element;
303     static JSValue *selectedIndexGetter(ExecState *exec, JSObject *, const Identifier &propertyName, const PropertySlot &slot);
304     static JSValue *selectedValueGetter(ExecState *exec, JSObject *, const Identifier &propertyName, const PropertySlot &slot);
305 };
306 
307 ////////////////////// Option Object ////////////////////////
308 
309 class OptionConstructorImp : public JSObject
310 {
311 public:
312     OptionConstructorImp(ExecState *exec, DOM::DocumentImpl *d);
313     bool implementsConstruct() const override;
314     using KJS::JSObject::construct;
315     JSObject *construct(ExecState *exec, const List &args) override;
316 private:
317     SharedPtr<DOM::DocumentImpl> doc;
318 };
319 
320 ////////////////////// Image Object ////////////////////////
321 
322 class ImageConstructorImp : public JSObject
323 {
324 public:
325     ImageConstructorImp(ExecState *exec, DOM::DocumentImpl *d);
326     bool implementsConstruct() const override;
327     using KJS::JSObject::construct;
328     JSObject *construct(ExecState *exec, const List &args) override;
329 private:
330     SharedPtr<DOM::DocumentImpl> doc;
331 };
332 
333 JSValue *getHTMLCollection(ExecState *exec, DOM::HTMLCollectionImpl *c, bool hide = false);
334 JSValue *getSelectHTMLCollection(ExecState *exec, DOM::HTMLCollectionImpl *c, DOM::HTMLSelectElementImpl *e);
335 
336 //All the pseudo constructors..
337 DEFINE_PSEUDO_CONSTRUCTOR(HTMLElementPseudoCtor)
338 DEFINE_PSEUDO_CONSTRUCTOR(HTMLHtmlElementPseudoCtor)
339 DEFINE_PSEUDO_CONSTRUCTOR(HTMLHeadElementPseudoCtor)
340 DEFINE_PSEUDO_CONSTRUCTOR(HTMLLinkElementPseudoCtor)
341 DEFINE_PSEUDO_CONSTRUCTOR(HTMLTitleElementPseudoCtor)
342 DEFINE_PSEUDO_CONSTRUCTOR(HTMLMetaElementPseudoCtor)
343 DEFINE_PSEUDO_CONSTRUCTOR(HTMLBaseElementPseudoCtor)
344 DEFINE_PSEUDO_CONSTRUCTOR(HTMLIsIndexElementPseudoCtor)
345 DEFINE_PSEUDO_CONSTRUCTOR(HTMLStyleElementPseudoCtor)
346 DEFINE_PSEUDO_CONSTRUCTOR(HTMLBodyElementPseudoCtor)
347 DEFINE_PSEUDO_CONSTRUCTOR(HTMLFormElementPseudoCtor)
348 DEFINE_PSEUDO_CONSTRUCTOR(HTMLSelectElementPseudoCtor)
349 DEFINE_PSEUDO_CONSTRUCTOR(HTMLOptGroupElementPseudoCtor)
350 DEFINE_PSEUDO_CONSTRUCTOR(HTMLOptionElementPseudoCtor)
351 DEFINE_PSEUDO_CONSTRUCTOR(HTMLInputElementPseudoCtor)
352 DEFINE_PSEUDO_CONSTRUCTOR(HTMLTextAreaElementPseudoCtor)
353 DEFINE_PSEUDO_CONSTRUCTOR(HTMLButtonElementPseudoCtor)
354 DEFINE_PSEUDO_CONSTRUCTOR(HTMLLabelElementPseudoCtor)
355 DEFINE_PSEUDO_CONSTRUCTOR(HTMLFieldSetElementPseudoCtor)
356 DEFINE_PSEUDO_CONSTRUCTOR(HTMLLegendElementPseudoCtor)
357 DEFINE_PSEUDO_CONSTRUCTOR(HTMLUListElementPseudoCtor)
358 DEFINE_PSEUDO_CONSTRUCTOR(HTMLOListElementPseudoCtor)
359 DEFINE_PSEUDO_CONSTRUCTOR(HTMLDListElementPseudoCtor)
360 DEFINE_PSEUDO_CONSTRUCTOR(HTMLDirectoryElementPseudoCtor)
361 DEFINE_PSEUDO_CONSTRUCTOR(HTMLMenuElementPseudoCtor)
362 DEFINE_PSEUDO_CONSTRUCTOR(HTMLLIElementPseudoCtor)
363 DEFINE_PSEUDO_CONSTRUCTOR(HTMLDivElementPseudoCtor)
364 DEFINE_PSEUDO_CONSTRUCTOR(HTMLParagraphElementPseudoCtor)
365 DEFINE_PSEUDO_CONSTRUCTOR(HTMLHeadingElementPseudoCtor)
366 DEFINE_PSEUDO_CONSTRUCTOR(HTMLBlockQuoteElementPseudoCtor)
367 DEFINE_PSEUDO_CONSTRUCTOR(HTMLQuoteElementPseudoCtor)
368 DEFINE_PSEUDO_CONSTRUCTOR(HTMLPreElementPseudoCtor)
369 DEFINE_PSEUDO_CONSTRUCTOR(HTMLBRElementPseudoCtor)
370 DEFINE_PSEUDO_CONSTRUCTOR(HTMLBaseFontElementPseudoCtor)
371 DEFINE_PSEUDO_CONSTRUCTOR(HTMLFontElementPseudoCtor)
372 DEFINE_PSEUDO_CONSTRUCTOR(HTMLHRElementPseudoCtor)
373 DEFINE_PSEUDO_CONSTRUCTOR(HTMLModElementPseudoCtor)
374 DEFINE_PSEUDO_CONSTRUCTOR(HTMLAnchorElementPseudoCtor)
375 DEFINE_PSEUDO_CONSTRUCTOR(HTMLImageElementPseudoCtor)
376 DEFINE_PSEUDO_CONSTRUCTOR(HTMLObjectElementPseudoCtor)
377 DEFINE_PSEUDO_CONSTRUCTOR(HTMLParamElementPseudoCtor)
378 DEFINE_PSEUDO_CONSTRUCTOR(HTMLAppletElementPseudoCtor)
379 DEFINE_PSEUDO_CONSTRUCTOR(HTMLMapElementPseudoCtor)
380 DEFINE_PSEUDO_CONSTRUCTOR(HTMLAreaElementPseudoCtor)
381 DEFINE_PSEUDO_CONSTRUCTOR(HTMLScriptElementPseudoCtor)
382 DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableElementPseudoCtor)
383 DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableCaptionElementPseudoCtor)
384 DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableColElementPseudoCtor)
385 DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableSectionElementPseudoCtor)
386 DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableRowElementPseudoCtor)
387 DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableCellElementPseudoCtor)
388 DEFINE_PSEUDO_CONSTRUCTOR(HTMLFrameSetElementPseudoCtor)
389 DEFINE_PSEUDO_CONSTRUCTOR(HTMLLayerElementPseudoCtor)
390 DEFINE_PSEUDO_CONSTRUCTOR(HTMLFrameElementPseudoCtor)
391 DEFINE_PSEUDO_CONSTRUCTOR(HTMLIFrameElementPseudoCtor)
392 DEFINE_PSEUDO_CONSTRUCTOR(HTMLCollectionPseudoCtor)
393 DEFINE_PSEUDO_CONSTRUCTOR(HTMLMarqueeElementPseudoCtor)
394 DEFINE_PSEUDO_CONSTRUCTOR(HTMLCanvasElementPseudoCtor)
395 } // namespace
396 
397 #endif
398