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