d6d2f197f4be47221148eca5fbd15a803daeb2eb
[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 #include "JSHTMLElement.h"
28
29 namespace WebCore {
30     class HTMLCollection;
31     class HTMLDocument;
32     class HTMLElement;
33     class HTMLOptionsCollection;
34     class HTMLSelectElement;
35     class HTMLTableCaptionElement;
36     class HTMLTableSectionElement;
37 }
38
39 namespace KJS {
40
41   class JSAbstractEventListener;
42
43   KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(JSHTMLDocumentProto, WebCore::JSDocumentProto)
44
45   class JSHTMLDocument : public WebCore::JSDocument {
46   public:
47     JSHTMLDocument(ExecState*, WebCore::HTMLDocument*);
48     virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
49     JSValue* getValueProperty(ExecState*, int token) const;
50     virtual void put(ExecState*, const Identifier& propertyName, JSValue*, int attr = None);
51     void putValueProperty(ExecState*, int token, JSValue*, int /*attr*/);
52     virtual const ClassInfo* classInfo() const { return &info; }
53     static const ClassInfo info;
54     enum { Title, Referrer, Domain, URL, Body, Location, Cookie,
55            Images, Applets, Embeds, Links, Forms, Anchors, Scripts, All, Clear, Open, Close,
56            Write, WriteLn, GetElementsByName, CaptureEvents, ReleaseEvents,
57            BgColor, FgColor, AlinkColor, LinkColor, VlinkColor, LastModified, Height, Width, Dir, DesignMode };
58   private:
59     static JSValue* namedItemGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
60   };
61
62   // The inheritance chain for JSHTMLElement is a bit different from other
63   // classes that are "half-autogenerated". Because we return different ClassInfo structs
64   // depending on the type of element, we inherit JSHTMLElement from WebCore::JSHTMLElement
65   // instead of the other way around. 
66   KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(JSHTMLElementProto, WebCore::JSHTMLElementProto)
67
68   class JSHTMLElement : public WebCore::JSHTMLElement {
69   public:
70     JSHTMLElement(ExecState*, WebCore::HTMLElement*);
71     virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
72     JSValue* getValueProperty(ExecState*, int token) const;
73     virtual void put(ExecState*, const Identifier& propertyName, JSValue*, int attr = None);
74     void putValueProperty(ExecState*, int token, JSValue*, int);
75     virtual UString toString(ExecState*) const;
76     virtual void pushEventHandlerScope(ExecState*, ScopeChain &scope) const;
77     virtual JSValue* callAsFunction(ExecState*, JSObject* thisObj, const List& args);
78     virtual bool implementsCall() const;
79     virtual const ClassInfo* classInfo() const;
80     static const ClassInfo info;
81
82     static const ClassInfo
83       select_info, object_info, 
84       embed_info, table_info, caption_info, col_info, tablesection_info, tr_info,
85       tablecell_info, frameSet_info, frame_info, iFrame_info, marquee_info;
86
87     // FIXME: Might make sense to combine this with ClassInfo some day.
88     typedef JSValue* (JSHTMLElement::*GetterFunction)(ExecState*, int token) const;
89     typedef void (JSHTMLElement::*SetterFunction)(ExecState*, int token, JSValue*, const WebCore::String&);
90     struct Accessors { GetterFunction m_getter; SetterFunction m_setter; };
91     const Accessors* accessors() const;
92     static const Accessors
93       select_accessors, object_accessors, embed_accessors, table_accessors,
94       caption_accessors, col_accessors, tablesection_accessors, tr_accessors,
95       tablecell_accessors, frameSet_accessors, frame_accessors, iFrame_accessors, marquee_accessors;
96
97     JSValue* selectGetter(ExecState* exec, int token) const;
98     void  selectSetter(ExecState*, int token, JSValue*, const WebCore::String&);
99     JSValue* objectGetter(ExecState* exec, int token) const;
100     void  objectSetter(ExecState*, int token, JSValue*, const WebCore::String&);
101     JSValue* embedGetter(ExecState*, int token) const;
102     void  embedSetter(ExecState*, int token, JSValue*, const WebCore::String&);
103     JSValue* tableGetter(ExecState* exec, int token) const;
104     void  tableSetter(ExecState*, int token, JSValue*, const WebCore::String&);
105     JSValue* tableCaptionGetter(ExecState* exec, int token) const;
106     void  tableCaptionSetter(ExecState*, int token, JSValue*, const WebCore::String&);
107     JSValue* tableColGetter(ExecState* exec, int token) const;
108     void  tableColSetter(ExecState*, int token, JSValue*, const WebCore::String&);
109     JSValue* tableSectionGetter(ExecState* exec, int token) const;
110     void  tableSectionSetter(ExecState*, int token, JSValue*, const WebCore::String&);
111     JSValue* tableRowGetter(ExecState* exec, int token) const;
112     void  tableRowSetter(ExecState*, int token, JSValue*, const WebCore::String&);
113     JSValue* tableCellGetter(ExecState* exec, int token) const;
114     void  tableCellSetter(ExecState*, int token, JSValue*, const WebCore::String&);
115     JSValue* frameSetGetter(ExecState* exec, int token) const;
116     void  frameSetSetter(ExecState*, int token, JSValue*, const WebCore::String&);
117     JSValue* frameGetter(ExecState* exec, int token) const;
118     void  frameSetter(ExecState*, int token, JSValue*, const WebCore::String&);
119     JSValue* iFrameGetter(ExecState* exec, int token) const;
120     void  iFrameSetter(ExecState*, int token, JSValue*, const WebCore::String&);
121     JSValue* marqueeGetter(ExecState* exec, int token) const;
122     void  marqueeSetter(ExecState*, int token, JSValue*, const WebCore::String&);
123
124     enum {
125            SelectAdd,
126            SelectTabIndex, SelectValue, SelectSelectedIndex, SelectLength,
127            SelectRemove, SelectForm, SelectBlur, SelectType, SelectOptions,
128            SelectDisabled, SelectMultiple, SelectName, SelectNamedItem, SelectSize, SelectFocus,
129            ObjectHspace, ObjectHeight, ObjectAlign,
130            ObjectBorder, ObjectCode, ObjectType, ObjectVspace, ObjectArchive,
131            ObjectDeclare, ObjectForm, ObjectCodeBase, ObjectCodeType, ObjectData,
132            ObjectName, ObjectStandby, ObjectTabIndex, ObjectUseMap, ObjectWidth, ObjectContentDocument,
133            EmbedAlign, EmbedHeight, EmbedName, EmbedSrc, EmbedType, EmbedWidth,
134            TableSummary, TableTBodies, TableTHead, TableCellPadding,
135            TableDeleteCaption, TableCreateCaption, TableCaption, TableWidth,
136            TableCreateTFoot, TableAlign, TableTFoot, TableDeleteRow,
137            TableCellSpacing, TableRows, TableBgColor, TableBorder, TableFrame,
138            TableRules, TableCreateTHead, TableDeleteTHead, TableDeleteTFoot,
139            TableInsertRow, TableCaptionAlign, TableColCh, TableColChOff,
140            TableColAlign, TableColSpan, TableColVAlign, TableColWidth,
141            TableSectionCh, TableSectionDeleteRow, TableSectionChOff,
142            TableSectionRows, TableSectionAlign, TableSectionVAlign,
143            TableSectionInsertRow, TableRowSectionRowIndex, TableRowRowIndex,
144            TableRowChOff, TableRowCells, TableRowVAlign, TableRowCh,
145            TableRowAlign, TableRowBgColor, TableRowDeleteCell, TableRowInsertCell,
146            TableCellColSpan, TableCellNoWrap, TableCellAbbr, TableCellHeight,
147            TableCellWidth, TableCellCellIndex, TableCellChOff, TableCellBgColor,
148            TableCellCh, TableCellVAlign, TableCellRowSpan, TableCellHeaders,
149            TableCellAlign, TableCellAxis, TableCellScope, FrameSetCols,
150            FrameSetRows, FrameSrc, FrameLocation, FrameFrameBorder, FrameScrolling,
151            FrameMarginWidth, FrameLongDesc, FrameMarginHeight, FrameName, FrameContentDocument, FrameContentWindow, 
152            FrameNoResize, FrameWidth, FrameHeight, IFrameLongDesc, IFrameDocument, IFrameAlign,
153            IFrameFrameBorder, IFrameSrc, IFrameName, IFrameHeight,
154            IFrameMarginHeight, IFrameMarginWidth, IFrameScrolling, IFrameWidth, IFrameContentDocument, IFrameContentWindow,
155            MarqueeStart, MarqueeStop,
156            GetContext,
157            ElementInnerHTML, ElementId, ElementDir, ElementLang,
158            ElementClassName, ElementInnerText, ElementDocument, ElementChildren, ElementContentEditable,
159            ElementIsContentEditable, ElementOuterHTML, ElementOuterText
160   };
161   private:
162     static JSValue* selectIndexGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
163     static JSValue* framesetNameGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
164     static JSValue* frameWindowPropertyGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
165     static JSValue* runtimeObjectGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
166     static JSValue* runtimeObjectPropertyGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
167   };
168
169   WebCore::HTMLElement* toHTMLElement(JSValue*); // returns 0 if passed-in value is not a JSHTMLElement object
170   WebCore::HTMLTableCaptionElement* toHTMLTableCaptionElement(JSValue*); // returns 0 if passed-in value is not a JSHTMLElement object for a HTMLTableCaptionElement
171   WebCore::HTMLTableSectionElement* toHTMLTableSectionElement(JSValue*); // returns 0 if passed-in value is not a JSHTMLElement object for a HTMLTableSectionElement
172
173   KJS_DEFINE_PROTOTYPE(JSHTMLCollectionProto)
174
175   class JSHTMLCollection : public DOMObject {
176   public:
177     JSHTMLCollection(ExecState*, WebCore::HTMLCollection*);
178     ~JSHTMLCollection();
179     virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
180     virtual JSValue* callAsFunction(ExecState*, JSObject* thisObj, const List&args);
181     virtual bool implementsCall() const { return true; }
182     virtual bool toBoolean(ExecState*) const { return true; }
183     enum { Item, NamedItem, Tags };
184     JSValue* getNamedItems(ExecState*, const Identifier& propertyName) const;
185     virtual const ClassInfo* classInfo() const { return &info; }
186     static const ClassInfo info;
187     WebCore::HTMLCollection* impl() const { return m_impl.get(); }
188   protected:
189     RefPtr<WebCore::HTMLCollection> m_impl;
190   private:
191     static JSValue* lengthGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
192     static JSValue* indexGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
193     static JSValue* nameGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
194   };
195
196   class HTMLAllCollection : public JSHTMLCollection {
197   public:
198     HTMLAllCollection(ExecState* exec, WebCore::HTMLCollection* c) :
199       JSHTMLCollection(exec, c) { }
200     virtual bool toBoolean(ExecState*) const { return false; }
201     virtual bool masqueradeAsUndefined() const { return true; }
202   };
203   
204   ////////////////////// Image Object ////////////////////////
205
206   class ImageConstructorImp : public DOMObject {
207   public:
208     ImageConstructorImp(ExecState*, WebCore::Document*);
209     virtual bool implementsConstruct() const;
210     virtual JSObject* construct(ExecState*, const List& args);
211   private:
212     RefPtr<WebCore::Document> m_doc;
213   };
214
215   JSValue* getHTMLCollection(ExecState*, WebCore::HTMLCollection*);
216   JSValue* getHTMLOptionsCollection(ExecState*, WebCore::HTMLOptionsCollection*);
217   JSValue* getAllHTMLCollection(ExecState*, WebCore::HTMLCollection*);
218
219 } // namespace
220
221 #endif