WebCore:
[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) 2004 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, FrameContentWindow, 
147            FrameNoResize, IFrameLongDesc, IFrameDocument, IFrameAlign,
148            IFrameFrameBorder, IFrameSrc, IFrameName, IFrameHeight,
149            IFrameMarginHeight, IFrameMarginWidth, IFrameScrolling, IFrameWidth, IFrameContentDocument, IFrameContentWindow,
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     static CGColorRef Context2D::colorRefFromValue(ExecState *exec, const Value &value);
286     static QColor Context2D::colorFromValue(ExecState *exec, const Value &value);
287
288 private:
289     
290     void save();
291     void restore();
292     
293     CGContextRef drawingContext();
294     void setShadow(ExecState *exec);
295
296     DOM::HTMLElementImpl *_element;
297     unsigned int _needsFlushRasterCache;
298     
299     QPtrList<List> stateStack;
300     
301     Value _strokeStyle;
302     Value _fillStyle;
303     Value _lineWidth;
304     Value _lineCap;
305     Value _lineJoin;
306     Value _miterLimit;
307     Value _shadowOffsetX;
308     Value _shadowOffsetY;
309     Value _shadowBlur;
310     Value _shadowColor;
311     Value _globalAlpha;
312     Value _globalComposite;
313   };
314
315     struct ColorStop {
316         float stop;
317         float red;
318         float green;
319         float blue;
320         float alpha;
321         
322         ColorStop(float s, float r, float g, float b, float a) : stop(s), red(r), green(g), blue(b), alpha(a) {};
323     };
324
325
326   class Gradient : public DOMObject {
327   friend class Context2DFunction;
328   public:
329     //Gradient(const DOM::HTMLElement &e);
330     Gradient(float x0, float y0, float x1, float y1);
331     Gradient(float x0, float y0, float r0, float x1, float y1, float r1);
332     ~Gradient();
333     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
334     Value getValueProperty(ExecState *exec, int token) const;
335     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
336     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
337     virtual bool toBoolean(ExecState *) const { return true; }
338     virtual const ClassInfo* classInfo() const { return &info; }
339     static const ClassInfo info;
340
341     enum { 
342         AddColorStop
343     };
344     
345     enum {
346         Radial, Linear
347     };
348
349     CGShadingRef getShading();
350     
351     void addColorStop (float s, float r, float g, float b, float alpha);
352     const ColorStop *colorStops(int *count) const;
353     
354     int lastStop;
355     int nextStop;
356     
357 private:    
358     void commonInit();
359     
360     int _gradientType;
361     float _x0, _y0, _r0, _x1, _y1, _r1;
362     CGShadingRef _shadingRef;
363     
364     int maxStops;
365     int stopCount;
366     ColorStop *stops;
367     mutable int adjustedStopCount;
368     mutable ColorStop *adjustedStops;
369     mutable unsigned int stopsNeedAdjusting:1;
370     mutable unsigned int regenerateShading:1;
371   };
372
373   class ImagePattern : public DOMObject {
374   public:
375     //ImagePattern(const DOM::HTMLElement &e);
376     ImagePattern(Value i, int type);
377     ~ImagePattern();
378     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
379     Value getValueProperty(ExecState *exec, int token) const;
380     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
381     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
382     virtual bool toBoolean(ExecState *) const { return true; }
383     virtual const ClassInfo* classInfo() const { return &info; }
384     static const ClassInfo info;
385     
386     enum {
387         Repeat, RepeatX, RepeatY, NoRepeat
388     };
389     
390 private:
391     Value _image;
392     int _repetitionType;
393   };
394
395   Value getHTMLCollection(ExecState *exec, const DOM::HTMLCollection &c);
396   Value getSelectHTMLCollection(ExecState *exec, const DOM::HTMLCollection &c, const DOM::HTMLSelectElement &e);
397
398
399 }; // namespace
400
401 #endif