Reviewed by Eric.
[WebKit-https.git] / WebCore / bindings / js / kjs_html.h
1 // -*- c-basic-offset: 2 -*-
2 /*
3  *  This file is part of the KDE libraries
4  *  Copyright (C) 1999 Harri Porten (porten@kde.org)
5  *  Copyright (C) 2004, 2006 Apple Computer, Inc.
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Lesser General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public
18  *  License along with this library; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #ifndef KJS_HTML_H_
23 #define KJS_HTML_H_
24
25 #include "JSDocument.h"
26 #include "JSElement.h"
27
28 namespace WebCore {
29     class HTMLCollection;
30     class HTMLDocument;
31     class HTMLElement;
32     class HTMLSelectElement;
33     class HTMLTableCaptionElement;
34     class HTMLTableSectionElement;
35 }
36
37 namespace KJS {
38
39   class JSAbstractEventListener;
40
41   class JSHTMLDocument : public WebCore::JSDocument {
42   public:
43     JSHTMLDocument(ExecState *exec, WebCore::HTMLDocument *d);
44     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
45     JSValue *getValueProperty(ExecState *exec, int token) const;
46     virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None);
47     void putValueProperty(ExecState *exec, int token, JSValue *value, int /*attr*/);
48     virtual const ClassInfo* classInfo() const { return &info; }
49     static const ClassInfo info;
50     enum { Title, Referrer, Domain, URL, Body, Location, Cookie,
51            Images, Applets, Embeds, Links, Forms, Anchors, Scripts, All, Clear, Open, Close,
52            Write, WriteLn, GetElementsByName, CaptureEvents, ReleaseEvents,
53            BgColor, FgColor, AlinkColor, LinkColor, VlinkColor, LastModified, Height, Width, Dir, DesignMode };
54   private:
55     static JSValue *namedItemGetter(ExecState *, JSObject *, const Identifier&, const PropertySlot&);
56   };
57
58   KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(JSHTMLElementProto, WebCore::JSElementProto)
59
60   class JSHTMLElement : public WebCore::JSElement {
61   public:
62     JSHTMLElement(ExecState *exec, WebCore::HTMLElement *e);
63     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
64     JSValue *getValueProperty(ExecState *exec, int token) const;
65     virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None);
66     void putValueProperty(ExecState *exec, int token, JSValue *value, int);
67     virtual UString toString(ExecState *exec) const;
68     virtual void pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const;
69     virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List&args);
70     virtual bool implementsCall() const;
71     virtual const ClassInfo* classInfo() const;
72     static const ClassInfo info;
73
74     static const ClassInfo html_info, head_info, link_info, title_info,
75       meta_info, base_info, isIndex_info, style_info, body_info, form_info,
76       select_info, optGroup_info, option_info, input_info, textArea_info,
77       button_info, label_info, fieldSet_info, legend_info, ul_info, ol_info,
78       dl_info, dir_info, menu_info, li_info, div_info, p_info, heading_info,
79       blockQuote_info, q_info, pre_info, br_info, baseFont_info, font_info,
80       hr_info, mod_info, a_info, img_info, object_info, param_info,
81       applet_info, map_info, area_info, script_info, table_info,
82       caption_info, col_info, tablesection_info, tr_info,
83       tablecell_info, frameSet_info, frame_info, iFrame_info, marquee_info;
84
85     // FIXME: Might make sense to combine this with ClassInfo some day.
86     typedef JSValue *(JSHTMLElement::*GetterFunction)(ExecState *exec, int token) const;
87     typedef void (JSHTMLElement::*SetterFunction)(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
88     struct Accessors { GetterFunction m_getter; SetterFunction m_setter; };
89     const Accessors* accessors() const;
90     static const Accessors html_accessors, head_accessors, link_accessors, title_accessors,
91       meta_accessors, base_accessors, isIndex_accessors, style_accessors, body_accessors, form_accessors,
92       select_accessors, optGroup_accessors, option_accessors, input_accessors, textArea_accessors,
93       button_accessors, label_accessors, fieldSet_accessors, legend_accessors, ul_accessors, ol_accessors,
94       dl_accessors, dir_accessors, menu_accessors, li_accessors, div_accessors, p_accessors, heading_accessors,
95       blockQuote_accessors, q_accessors, pre_accessors, br_accessors, baseFont_accessors, font_accessors,
96       hr_accessors, mod_accessors, a_accessors, img_accessors, object_accessors, param_accessors,
97       applet_accessors, map_accessors, area_accessors, script_accessors, table_accessors,
98       caption_accessors, col_accessors, tablesection_accessors, tr_accessors,
99       tablecell_accessors, frameSet_accessors, frame_accessors, iFrame_accessors, marquee_accessors;
100
101     JSValue *htmlGetter(ExecState* exec, int token) const;
102     void  htmlSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
103     JSValue *headGetter(ExecState* exec, int token) const;
104     void  headSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
105     JSValue *linkGetter(ExecState* exec, int token) const;
106     void  linkSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
107     JSValue *titleGetter(ExecState* exec, int token) const;
108     void  titleSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
109     JSValue *metaGetter(ExecState* exec, int token) const;
110     void  metaSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
111     JSValue *baseGetter(ExecState* exec, int token) const;
112     void  baseSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
113     JSValue *isIndexGetter(ExecState* exec, int token) const;
114     void  isIndexSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
115     JSValue *styleGetter(ExecState* exec, int token) const;
116     void  styleSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
117     JSValue *bodyGetter(ExecState* exec, int token) const;
118     void  bodySetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
119     JSValue *formGetter(ExecState* exec, int token) const;
120     void  formSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
121     JSValue *selectGetter(ExecState* exec, int token) const;
122     void  selectSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
123     JSValue *optGroupGetter(ExecState* exec, int token) const;
124     void  optGroupSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
125     JSValue *optionGetter(ExecState* exec, int token) const;
126     void  optionSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
127     JSValue *inputGetter(ExecState* exec, int token) const;
128     void  inputSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
129     JSValue *textAreaGetter(ExecState* exec, int token) const;
130     void  textAreaSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
131     JSValue *buttonGetter(ExecState* exec, int token) const;
132     void  buttonSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
133     JSValue *labelGetter(ExecState* exec, int token) const;
134     void  labelSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
135     JSValue *fieldSetGetter(ExecState* exec, int token) const;
136     void  fieldSetSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
137     JSValue *legendGetter(ExecState* exec, int token) const;
138     void  legendSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
139     JSValue *uListGetter(ExecState* exec, int token) const;
140     void  uListSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
141     JSValue *oListGetter(ExecState* exec, int token) const;
142     void  oListSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
143     JSValue *dListGetter(ExecState* exec, int token) const;
144     void  dListSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
145     JSValue *dirGetter(ExecState* exec, int token) const;
146     void  dirSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
147     JSValue *menuGetter(ExecState* exec, int token) const;
148     void  menuSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
149     JSValue *liGetter(ExecState* exec, int token) const;
150     void  liSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
151     JSValue *divGetter(ExecState* exec, int token) const;
152     void  divSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
153     JSValue *paragraphGetter(ExecState* exec, int token) const;
154     void  paragraphSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
155     JSValue *headingGetter(ExecState* exec, int token) const;
156     void  headingSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
157     JSValue *blockQuoteGetter(ExecState* exec, int token) const;
158     void  blockQuoteSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
159     JSValue *quoteGetter(ExecState* exec, int token) const;
160     void  quoteSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
161     JSValue *preGetter(ExecState* exec, int token) const;
162     void  preSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
163     JSValue *brGetter(ExecState* exec, int token) const;
164     void  brSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
165     JSValue *baseFontGetter(ExecState* exec, int token) const;
166     void  baseFontSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
167     JSValue *fontGetter(ExecState* exec, int token) const;
168     void  fontSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
169     JSValue *hrGetter(ExecState* exec, int token) const;
170     void  hrSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
171     JSValue *modGetter(ExecState* exec, int token) const;
172     void  modSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
173     JSValue *anchorGetter(ExecState* exec, int token) const;
174     void  anchorSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
175     JSValue *imageGetter(ExecState* exec, int token) const;
176     void  imageSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
177     JSValue *objectGetter(ExecState* exec, int token) const;
178     void  objectSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
179     JSValue *paramGetter(ExecState* exec, int token) const;
180     void  paramSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
181     JSValue *appletGetter(ExecState* exec, int token) const;
182     void  appletSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
183     JSValue *mapGetter(ExecState* exec, int token) const;
184     void  mapSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
185     JSValue *areaGetter(ExecState* exec, int token) const;
186     void  areaSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
187     JSValue *scriptGetter(ExecState* exec, int token) const;
188     void  scriptSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
189     JSValue *tableGetter(ExecState* exec, int token) const;
190     void  tableSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
191     JSValue *tableCaptionGetter(ExecState* exec, int token) const;
192     void  tableCaptionSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
193     JSValue *tableColGetter(ExecState* exec, int token) const;
194     void  tableColSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
195     JSValue *tableSectionGetter(ExecState* exec, int token) const;
196     void  tableSectionSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
197     JSValue *tableRowGetter(ExecState* exec, int token) const;
198     void  tableRowSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
199     JSValue *tableCellGetter(ExecState* exec, int token) const;
200     void  tableCellSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
201     JSValue *frameSetGetter(ExecState* exec, int token) const;
202     void  frameSetSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
203     JSValue *frameGetter(ExecState* exec, int token) const;
204     void  frameSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
205     JSValue *iFrameGetter(ExecState* exec, int token) const;
206     void  iFrameSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
207     JSValue *marqueeGetter(ExecState* exec, int token) const;
208     void  marqueeSetter(ExecState *exec, int token, JSValue *value, const WebCore::String& str);
209
210     enum { HtmlVersion, HeadProfile, LinkHref, LinkRel, LinkMedia,
211            LinkCharset, LinkDisabled, LinkHrefLang, LinkRev, LinkTarget, LinkType,
212            LinkSheet, TitleText, MetaName, MetaHttpEquiv, MetaContent, MetaScheme,
213            BaseHref, BaseTarget, IsIndexForm, IsIndexPrompt, StyleDisabled,
214            StyleSheet, StyleType, StyleMedia, BodyBackground, BodyVLink, BodyText,
215            BodyLink, BodyALink, BodyBgColor, BodyScrollLeft, BodyScrollTop, BodyScrollHeight, BodyScrollWidth,
216            FormAction, FormEncType, FormElements, FormLength, FormAcceptCharset,
217            FormReset, FormTarget, FormName, FormMethod, FormSubmit, SelectAdd,
218            SelectTabIndex, SelectValue, SelectSelectedIndex, SelectLength,
219            SelectRemove, SelectForm, SelectBlur, SelectType, SelectOptions,
220            SelectDisabled, SelectMultiple, SelectName, SelectSize, SelectFocus,
221            OptGroupDisabled, OptGroupLabel, OptionIndex, OptionSelected,
222            OptionForm, OptionText, OptionDefaultSelected, OptionDisabled,
223            OptionLabel, OptionValue, InputBlur, InputReadOnly, InputAccept,
224            InputSize, InputDefaultValue, InputTabIndex, InputValue, InputType,
225            InputFocus, InputMaxLength, InputDefaultChecked, InputDisabled,
226            InputChecked, InputIndeterminate, InputForm, InputAccessKey, InputAlign, InputAlt,
227            InputName, InputSrc, InputUseMap, InputSelect, InputClick,
228            InputSelectionStart, InputSelectionEnd, InputSetSelectionRange,
229            TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect, TextAreaSetSelectionRange,
230            TextAreaCols, TextAreaDisabled, TextAreaForm, TextAreaType,
231            TextAreaTabIndex, TextAreaReadOnly, TextAreaRows, TextAreaValue,
232            TextAreaSelectionStart, TextAreaSelectionEnd,
233            TextAreaBlur, TextAreaFocus, ButtonBlur, ButtonFocus, ButtonForm, ButtonTabIndex, ButtonName,
234            ButtonDisabled, ButtonAccessKey, ButtonType, ButtonValue, LabelHtmlFor,
235            LabelForm, LabelFocus, LabelAccessKey, FieldSetForm, LegendForm, LegendAccessKey,
236            LegendAlign, LegendFocus, UListType, UListCompact, OListStart, OListCompact,
237            OListType, DListCompact, DirectoryCompact, MenuCompact, LIType,
238            LIValue, DivAlign, ParagraphAlign, HeadingAlign, BlockQuoteCite,
239            QuoteCite, PreWidth, PreWrap, BRClear, BaseFontColor, BaseFontSize,
240            BaseFontFace, FontColor, FontSize, FontFace, HRWidth, HRNoShade,
241            HRAlign, HRSize, ModCite, ModDateTime, AnchorShape, AnchorRel,
242            AnchorAccessKey, AnchorCoords, AnchorHref, AnchorProtocol, AnchorHost,
243            AnchorCharset, AnchorHrefLang, AnchorHostname, AnchorType, AnchorFocus,
244            AnchorPort, AnchorPathName, AnchorHash, AnchorSearch, AnchorName,
245            AnchorRev, AnchorTabIndex, AnchorTarget, AnchorText, AnchorBlur, AnchorToString, 
246            ImageName, ImageAlign, ImageHspace, ImageVspace, ImageUseMap, ImageAlt,
247            ImageLowSrc, ImageWidth, ImageIsMap, ImageBorder, ImageHeight, ImageComplete,
248            ImageLongDesc, ImageSrc, ImageX, ImageY, ObjectHspace, ObjectHeight, ObjectAlign,
249            ObjectBorder, ObjectCode, ObjectType, ObjectVspace, ObjectArchive,
250            ObjectDeclare, ObjectForm, ObjectCodeBase, ObjectCodeType, ObjectData,
251            ObjectName, ObjectStandby, ObjectTabIndex, ObjectUseMap, ObjectWidth, ObjectContentDocument,
252            ParamName, ParamType, ParamValueType, ParamValue, AppletArchive,
253            AppletAlt, AppletCode, AppletWidth, AppletAlign, AppletCodeBase,
254            AppletName, AppletHeight, AppletHspace, AppletObject, AppletVspace,
255            MapAreas, MapName, AreaHash, AreaHref, AreaTarget, AreaPort, AreaShape,
256            AreaCoords, AreaAlt, AreaAccessKey, AreaNoHref, AreaHost, AreaProtocol,
257            AreaHostName, AreaPathName, AreaSearch, AreaTabIndex, ScriptEvent,
258            ScriptType, ScriptHtmlFor, ScriptText, ScriptSrc, ScriptCharset,
259            ScriptDefer, TableSummary, TableTBodies, TableTHead, TableCellPadding,
260            TableDeleteCaption, TableCreateCaption, TableCaption, TableWidth,
261            TableCreateTFoot, TableAlign, TableTFoot, TableDeleteRow,
262            TableCellSpacing, TableRows, TableBgColor, TableBorder, TableFrame,
263            TableRules, TableCreateTHead, TableDeleteTHead, TableDeleteTFoot,
264            TableInsertRow, TableCaptionAlign, TableColCh, TableColChOff,
265            TableColAlign, TableColSpan, TableColVAlign, TableColWidth,
266            TableSectionCh, TableSectionDeleteRow, TableSectionChOff,
267            TableSectionRows, TableSectionAlign, TableSectionVAlign,
268            TableSectionInsertRow, TableRowSectionRowIndex, TableRowRowIndex,
269            TableRowChOff, TableRowCells, TableRowVAlign, TableRowCh,
270            TableRowAlign, TableRowBgColor, TableRowDeleteCell, TableRowInsertCell,
271            TableCellColSpan, TableCellNoWrap, TableCellAbbr, TableCellHeight,
272            TableCellWidth, TableCellCellIndex, TableCellChOff, TableCellBgColor,
273            TableCellCh, TableCellVAlign, TableCellRowSpan, TableCellHeaders,
274            TableCellAlign, TableCellAxis, TableCellScope, FrameSetCols,
275            FrameSetRows, FrameSrc, FrameLocation, FrameFrameBorder, FrameScrolling,
276            FrameMarginWidth, FrameLongDesc, FrameMarginHeight, FrameName, FrameContentDocument, FrameContentWindow, 
277            FrameNoResize, FrameWidth, FrameHeight, IFrameLongDesc, IFrameDocument, IFrameAlign,
278            IFrameFrameBorder, IFrameSrc, IFrameName, IFrameHeight,
279            IFrameMarginHeight, IFrameMarginWidth, IFrameScrolling, IFrameWidth, IFrameContentDocument, IFrameContentWindow,
280            MarqueeStart, MarqueeStop,
281            GetContext,
282            ElementInnerHTML, ElementTitle, ElementId, ElementDir, ElementLang,
283            ElementClassName, ElementInnerText, ElementDocument, ElementChildren, ElementContentEditable,
284            ElementIsContentEditable, ElementOuterHTML, ElementOuterText};
285   private:
286     static JSValue *formIndexGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
287     static JSValue *formNameGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
288     static JSValue *selectIndexGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
289     static JSValue *framesetNameGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
290     static JSValue *frameWindowPropertyGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
291     static JSValue *runtimeObjectGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
292     static JSValue *runtimeObjectPropertyGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
293   };
294
295   WebCore::HTMLElement *toHTMLElement(JSValue *); // returns 0 if passed-in value is not a JSHTMLElement object
296   WebCore::HTMLTableCaptionElement *toHTMLTableCaptionElement(JSValue *); // returns 0 if passed-in value is not a JSHTMLElement object for a HTMLTableCaptionElement
297   WebCore::HTMLTableSectionElement *toHTMLTableSectionElement(JSValue *); // returns 0 if passed-in value is not a JSHTMLElement object for a HTMLTableSectionElement
298
299   class JSHTMLCollection : public DOMObject {
300   public:
301     JSHTMLCollection(ExecState *exec, WebCore::HTMLCollection *c);
302     ~JSHTMLCollection();
303     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
304     virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List&args);
305     virtual bool implementsCall() const { return true; }
306     virtual bool toBoolean(ExecState *) const { return true; }
307     enum { Item, NamedItem, Tags };
308     JSValue *getNamedItems(ExecState *exec, const Identifier &propertyName) const;
309     virtual const ClassInfo* classInfo() const { return &info; }
310     static const ClassInfo info;
311     WebCore::HTMLCollection *impl() const { return m_impl.get(); }
312   protected:
313     RefPtr<WebCore::HTMLCollection> m_impl;
314   private:
315     static JSValue *lengthGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
316     static JSValue *indexGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
317     static JSValue *nameGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
318   };
319
320   class JSHTMLSelectCollection : public JSHTMLCollection {
321   public:
322     JSHTMLSelectCollection(ExecState *exec, WebCore::HTMLCollection *c, WebCore::HTMLSelectElement *e);
323     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
324     virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None);
325   private:
326     static JSValue *selectedIndexGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
327
328     RefPtr<WebCore::HTMLSelectElement> m_element;
329   };
330
331   class HTMLAllCollection : public JSHTMLCollection {
332   public:
333     HTMLAllCollection(ExecState *exec, WebCore::HTMLCollection *c) :
334       JSHTMLCollection(exec, c) { }
335     virtual bool toBoolean(ExecState *) const { return false; }
336     virtual bool masqueradeAsUndefined() const { return true; }
337   };
338   
339   ////////////////////// Option Object ////////////////////////
340
341   class OptionConstructorImp : public DOMObject {
342   public:
343     OptionConstructorImp(ExecState *exec, WebCore::Document *d);
344     virtual bool implementsConstruct() const;
345     virtual JSObject *construct(ExecState *exec, const List &args);
346   private:
347     RefPtr<WebCore::Document> m_doc;
348   };
349
350   ////////////////////// Image Object ////////////////////////
351
352   class ImageConstructorImp : public DOMObject {
353   public:
354     ImageConstructorImp(ExecState *exec, WebCore::Document *d);
355     virtual bool implementsConstruct() const;
356     virtual JSObject *construct(ExecState *exec, const List &args);
357   private:
358     RefPtr<WebCore::Document> m_doc;
359   };
360
361   JSValue *getHTMLCollection(ExecState *exec, WebCore::HTMLCollection *c);
362   JSValue *getSelectHTMLCollection(ExecState *exec, WebCore::HTMLCollection *c, WebCore::HTMLSelectElement *e);
363   JSValue *getAllHTMLCollection(ExecState *exec, WebCore::HTMLCollection *c);
364
365 } // namespace
366
367 #endif