Updated to <canvas> API to match the spec. (Still need
[WebKit-https.git] / WebCore / khtml / ecma / 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) 2003 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 "dom/html_document.h"
26 #include "dom/html_base.h"
27 #include "dom/html_misc.h"
28 #include "dom/html_form.h"
29 #include "misc/loader_client.h"
30
31 #include "ecma/kjs_binding.h"
32 #include "ecma/kjs_dom.h"
33
34 #include <qguardedptr.h>
35
36 #include <ApplicationServices/ApplicationServices.h>
37
38 class HTMLElement;
39
40 namespace KJS {
41
42   class HTMLDocument : public DOMDocument {
43   public:
44     HTMLDocument(ExecState *exec, const DOM::HTMLDocument &d) : DOMDocument(exec, d) { }
45     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
46     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
47     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
48     virtual bool hasProperty(ExecState *exec, const Identifier &propertyName) const;
49     virtual const ClassInfo* classInfo() const { return &info; }
50     static const ClassInfo info;
51     enum { Title, Referrer, Domain, URL, Body, Location, Cookie,
52            Images, Applets, Embeds, Links, Forms, Anchors, Scripts, All, Clear, Open, Close,
53            Write, WriteLn, GetElementsByName, CaptureEvents, ReleaseEvents,
54            BgColor, FgColor, AlinkColor, LinkColor, VlinkColor, LastModified, Height, Width, Dir, DesignMode };
55     DOM::Document toDocument() const { return static_cast<DOM::Document>( node ); }
56   };
57
58   class HTMLElement : public DOMElement {
59   public:
60     HTMLElement(ExecState *exec, const DOM::HTMLElement &e) : DOMElement(exec, e) { }
61     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
62     Value getValueProperty(ExecState *exec, int token) const;
63     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
64     void putValue(ExecState *exec, int token, const Value& value, int);
65     virtual bool hasProperty(ExecState *exec, const Identifier &propertyName) const;
66     virtual UString toString(ExecState *exec) const;
67     virtual void pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const;
68     virtual const ClassInfo* classInfo() const;
69     static const ClassInfo info;
70
71     static const ClassInfo html_info, head_info, link_info, title_info,
72       meta_info, base_info, isIndex_info, style_info, body_info, form_info,
73       select_info, optGroup_info, option_info, input_info, textArea_info,
74       button_info, label_info, fieldSet_info, legend_info, ul_info, ol_info,
75       dl_info, dir_info, menu_info, li_info, div_info, p_info, heading_info,
76       blockQuote_info, q_info, pre_info, br_info, baseFont_info, font_info,
77       hr_info, mod_info, a_info, canvas_info, img_info, object_info, param_info,
78       applet_info, map_info, area_info, script_info, table_info,
79       caption_info, col_info, tablesection_info, tr_info,
80       tablecell_info, frameSet_info, frame_info, iFrame_info, marquee_info;
81
82     enum { HtmlVersion, HeadProfile, LinkHref, LinkRel, LinkMedia,
83            LinkCharset, LinkDisabled, LinkHrefLang, LinkRev, LinkTarget, LinkType,
84            LinkSheet, TitleText, MetaName, MetaHttpEquiv, MetaContent, MetaScheme,
85            BaseHref, BaseTarget, IsIndexForm, IsIndexPrompt, StyleDisabled,
86            StyleSheet, StyleType, StyleMedia, BodyBackground, BodyVLink, BodyText,
87            BodyLink, BodyALink, BodyBgColor, BodyScrollLeft, BodyScrollTop, BodyScrollHeight, BodyScrollWidth,
88            FormAction, FormEncType, FormElements, FormLength, FormAcceptCharset,
89            FormReset, FormTarget, FormName, FormMethod, FormSubmit, SelectAdd,
90            SelectTabIndex, SelectValue, SelectSelectedIndex, SelectLength,
91            SelectRemove, SelectForm, SelectBlur, SelectType, SelectOptions,
92            SelectDisabled, SelectMultiple, SelectName, SelectSize, SelectFocus,
93            OptGroupDisabled, OptGroupLabel, OptionIndex, OptionSelected,
94            OptionForm, OptionText, OptionDefaultSelected, OptionDisabled,
95            OptionLabel, OptionValue, InputBlur, InputReadOnly, InputAccept,
96            InputSize, InputDefaultValue, InputTabIndex, InputValue, InputType,
97            InputFocus, InputMaxLength, InputDefaultChecked, InputDisabled,
98            InputChecked, InputForm, InputAccessKey, InputAlign, InputAlt,
99            InputName, InputSrc, InputUseMap, InputSelect, InputClick,
100            TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect,
101            TextAreaCols, TextAreaDisabled, TextAreaForm, TextAreaType,
102            TextAreaTabIndex, TextAreaReadOnly, TextAreaRows, TextAreaValue,
103            TextAreaBlur, TextAreaFocus, ButtonForm, ButtonTabIndex, ButtonName,
104            ButtonDisabled, ButtonAccessKey, ButtonType, ButtonValue, LabelHtmlFor,
105            LabelForm, LabelAccessKey, FieldSetForm, LegendForm, LegendAccessKey,
106            LegendAlign, UListType, UListCompact, OListStart, OListCompact,
107            OListType, DListCompact, DirectoryCompact, MenuCompact, LIType,
108            LIValue, DivAlign, ParagraphAlign, HeadingAlign, BlockQuoteCite,
109            QuoteCite, PreWidth, BRClear, BaseFontColor, BaseFontSize,
110            BaseFontFace, FontColor, FontSize, FontFace, HRWidth, HRNoShade,
111            HRAlign, HRSize, ModCite, ModDateTime, AnchorShape, AnchorRel,
112            AnchorAccessKey, AnchorCoords, AnchorHref, AnchorProtocol, AnchorHost,
113            AnchorCharset, AnchorHrefLang, AnchorHostname, AnchorType, AnchorFocus,
114            AnchorPort, AnchorPathName, AnchorHash, AnchorSearch, AnchorName,
115            AnchorRev, AnchorTabIndex, AnchorTarget, AnchorText, AnchorBlur, AnchorToString, 
116            ImageName, ImageAlign, ImageHspace, ImageVspace, ImageUseMap, ImageAlt,
117            ImageLowSrc, ImageWidth, ImageIsMap, ImageBorder, ImageHeight,
118            ImageLongDesc, ImageSrc, ImageX, ImageY, ObjectHspace, ObjectHeight, ObjectAlign,
119            ObjectBorder, ObjectCode, ObjectType, ObjectVspace, ObjectArchive,
120            ObjectDeclare, ObjectForm, ObjectCodeBase, ObjectCodeType, ObjectData,
121            ObjectName, ObjectStandby, ObjectTabIndex, ObjectUseMap, ObjectWidth, ObjectContentDocument,
122            ParamName, ParamType, ParamValueType, ParamValue, AppletArchive,
123            AppletAlt, AppletCode, AppletWidth, AppletAlign, AppletCodeBase,
124            AppletName, AppletHeight, AppletHspace, AppletObject, AppletVspace,
125            MapAreas, MapName, AreaHash, AreaHref, AreaTarget, AreaPort, AreaShape,
126            AreaCoords, AreaAlt, AreaAccessKey, AreaNoHref, AreaHost, AreaProtocol,
127            AreaHostName, AreaPathName, AreaSearch, AreaTabIndex, ScriptEvent,
128            ScriptType, ScriptHtmlFor, ScriptText, ScriptSrc, ScriptCharset,
129            ScriptDefer, TableSummary, TableTBodies, TableTHead, TableCellPadding,
130            TableDeleteCaption, TableCreateCaption, TableCaption, TableWidth,
131            TableCreateTFoot, TableAlign, TableTFoot, TableDeleteRow,
132            TableCellSpacing, TableRows, TableBgColor, TableBorder, TableFrame,
133            TableRules, TableCreateTHead, TableDeleteTHead, TableDeleteTFoot,
134            TableInsertRow, TableCaptionAlign, TableColCh, TableColChOff,
135            TableColAlign, TableColSpan, TableColVAlign, TableColWidth,
136            TableSectionCh, TableSectionDeleteRow, TableSectionChOff,
137            TableSectionRows, TableSectionAlign, TableSectionVAlign,
138            TableSectionInsertRow, TableRowSectionRowIndex, TableRowRowIndex,
139            TableRowChOff, TableRowCells, TableRowVAlign, TableRowCh,
140            TableRowAlign, TableRowBgColor, TableRowDeleteCell, TableRowInsertCell,
141            TableCellColSpan, TableCellNoWrap, TableCellAbbr, TableCellHeight,
142            TableCellWidth, TableCellCellIndex, TableCellChOff, TableCellBgColor,
143            TableCellCh, TableCellVAlign, TableCellRowSpan, TableCellHeaders,
144            TableCellAlign, TableCellAxis, TableCellScope, FrameSetCols,
145            FrameSetRows, FrameSrc, FrameLocation, FrameFrameBorder, FrameScrolling,
146            FrameMarginWidth, FrameLongDesc, FrameMarginHeight, FrameName, FrameContentDocument,
147            FrameNoResize, IFrameLongDesc, IFrameDocument, IFrameAlign,
148            IFrameFrameBorder, IFrameSrc, IFrameName, IFrameHeight,
149            IFrameMarginHeight, IFrameMarginWidth, IFrameScrolling, IFrameWidth, IFrameContentDocument,
150            MarqueeStart, MarqueeStop,
151            GetContext,
152            ElementInnerHTML, ElementTitle, ElementId, ElementDir, ElementLang,
153            ElementClassName, ElementInnerText, ElementDocument, ElementChildren, ElementContentEditable,
154            ElementIsContentEditable, ElementOuterHTML, ElementOuterText};
155
156     DOM::HTMLElement toElement() const { return static_cast<DOM::HTMLElement>(node); }
157   };
158
159
160   class HTMLElementFunction : public DOMFunction {
161   public:
162     HTMLElementFunction(ExecState *exec, int i, int len);
163     virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args);
164   private:
165     int id;
166   };
167
168   class HTMLCollection : public DOMObject {
169   public:
170     HTMLCollection(ExecState *exec, const DOM::HTMLCollection &c);
171     ~HTMLCollection();
172     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
173     virtual Value call(ExecState *exec, Object &thisObj, const List&args);
174     virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args);
175     virtual bool implementsCall() const { return true; }
176     virtual bool toBoolean(ExecState *) const { return true; }
177     virtual bool hasProperty(ExecState *exec, const Identifier &p) const;
178     enum { Item, NamedItem, Tags };
179     Value getNamedItems(ExecState *exec, const Identifier &propertyName) const;
180     virtual const ClassInfo* classInfo() const { return &info; }
181     static const ClassInfo info;
182     DOM::HTMLCollection toCollection() const { return collection; }
183   protected:
184     DOM::HTMLCollection collection;
185   };
186
187   class HTMLSelectCollection : public HTMLCollection {
188   public:
189     HTMLSelectCollection(ExecState *exec, const DOM::HTMLCollection &c, const DOM::HTMLSelectElement &e)
190       : HTMLCollection(exec, c), element(e) { }
191     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
192     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
193   private:
194     DOM::HTMLSelectElement element;
195   };
196
197   ////////////////////// Option Object ////////////////////////
198
199   class OptionConstructorImp : public ObjectImp {
200   public:
201     OptionConstructorImp(ExecState *exec, const DOM::Document &d);
202     virtual bool implementsConstruct() const;
203     virtual Object construct(ExecState *exec, const List &args);
204   private:
205     DOM::Document doc;
206   };
207
208   ////////////////////// Image Object ////////////////////////
209
210   class ImageConstructorImp : public ObjectImp {
211   public:
212     ImageConstructorImp(ExecState *exec, const DOM::Document &d);
213     virtual bool implementsConstruct() const;
214     virtual Object construct(ExecState *exec, const List &args);
215   private:
216     DOM::Document doc;
217   };
218
219   class Image : public DOMObject, public khtml::CachedObjectClient {
220   public:
221     Image(const DOM::Document &d);
222     ~Image();
223     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
224     Value getValueProperty(ExecState *exec, int token) const;
225     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
226     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
227     void notifyFinished(khtml::CachedObject *);
228     virtual bool toBoolean(ExecState *) const { return true; }
229     virtual const ClassInfo* classInfo() const { return &info; }
230     static const ClassInfo info;
231     enum { Src, Complete, OnLoad };
232     
233     khtml::CachedImage* image() { return img; }
234     
235   private:
236     UString src;
237     QGuardedPtr<DOM::DocumentImpl> doc;
238     khtml::CachedImage* img;
239     JSEventListener *onLoadListener;
240   };
241
242   ////////////////////// Context2D Object ////////////////////////
243
244   class Context2D : public DOMObject {
245   friend class Context2DFunction;
246   public:
247     Context2D(const DOM::HTMLElement &e);
248     ~Context2D();
249     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
250     Value getValueProperty(ExecState *exec, int token) const;
251     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
252     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
253     virtual bool toBoolean(ExecState *) const { return true; }
254     virtual const ClassInfo* classInfo() const { return &info; }
255     static const ClassInfo info;
256
257     enum { 
258         StrokeStyle,
259         FillStyle,
260         LineWidth,
261         LineCap,
262         LineJoin,
263         MiterLimit,
264         ShadowOffsetX,
265         ShadowOffsetY,
266         ShadowBlur,
267         ShadowColor,
268         GlobalAlpha,
269         GlobalCompositeOperation,
270         Save, Restore,
271         Scale, Rotate, Translate,
272         BeginPath, ClosePath, 
273         SetStrokeColor, SetFillColor, SetLineWidth, SetLineCap, SetLineJoin, SetMiterLimit, 
274         Fill, Stroke, 
275         MoveTo, LineTo, QuadraticCurveTo, BezierCurveTo, ArcTo, Arc, Rect, Clip,
276         ClearRect, FillRect, StrokeRect,
277         DrawImage, DrawImageFromRect,
278         SetShadow, ClearShadow,
279         SetAlpha, SetCompositeOperation,
280         CreateLinearGradient,
281         CreateRadialGradient,
282         CreatePattern
283     };
284
285 private:
286     static CGColorRef Context2D::colorRefFromValue(ExecState *exec, const Value &value);
287     static QColor Context2D::colorFromValue(ExecState *exec, const Value &value);
288     
289     void save();
290     void restore();
291     
292     CGContextRef drawingContext();
293     void setShadow(ExecState *exec);
294
295     DOM::HTMLElementImpl *_element;
296     unsigned int _needsFlushRasterCache;
297     
298     QPtrList<List> stateStack;
299     
300     Value _strokeStyle;
301     Value _fillStyle;
302     Value _lineWidth;
303     Value _lineCap;
304     Value _lineJoin;
305     Value _miterLimit;
306     Value _shadowOffsetX;
307     Value _shadowOffsetY;
308     Value _shadowBlur;
309     Value _shadowColor;
310     Value _globalAlpha;
311     Value _globalComposite;
312   };
313
314   Value getHTMLCollection(ExecState *exec, const DOM::HTMLCollection &c);
315   Value getSelectHTMLCollection(ExecState *exec, const DOM::HTMLCollection &c, const DOM::HTMLSelectElement &e);
316
317
318 }; // namespace
319
320 #endif