Fix for 3867759, .mac regression where scrollers don't show up. Make sure you can...
[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 #if APPLE_CHANGES
72     virtual Value call(ExecState *exec, Object &thisObj, const List&args);
73     virtual bool implementsCall() const;
74 #endif
75
76     static const ClassInfo html_info, head_info, link_info, title_info,
77       meta_info, base_info, isIndex_info, style_info, body_info, form_info,
78       select_info, optGroup_info, option_info, input_info, textArea_info,
79       button_info, label_info, fieldSet_info, legend_info, ul_info, ol_info,
80       dl_info, dir_info, menu_info, li_info, div_info, p_info, heading_info,
81       blockQuote_info, q_info, pre_info, br_info, baseFont_info, font_info,
82       hr_info, mod_info, a_info, canvas_info, img_info, object_info, param_info,
83       applet_info, map_info, area_info, script_info, table_info,
84       caption_info, col_info, tablesection_info, tr_info,
85       tablecell_info, frameSet_info, frame_info, iFrame_info, marquee_info;
86
87     enum { HtmlVersion, HeadProfile, LinkHref, LinkRel, LinkMedia,
88            LinkCharset, LinkDisabled, LinkHrefLang, LinkRev, LinkTarget, LinkType,
89            LinkSheet, TitleText, MetaName, MetaHttpEquiv, MetaContent, MetaScheme,
90            BaseHref, BaseTarget, IsIndexForm, IsIndexPrompt, StyleDisabled,
91            StyleSheet, StyleType, StyleMedia, BodyBackground, BodyVLink, BodyText,
92            BodyLink, BodyALink, BodyBgColor, BodyScrollLeft, BodyScrollTop, BodyScrollHeight, BodyScrollWidth,
93            FormAction, FormEncType, FormElements, FormLength, FormAcceptCharset,
94            FormReset, FormTarget, FormName, FormMethod, FormSubmit, SelectAdd,
95            SelectTabIndex, SelectValue, SelectSelectedIndex, SelectLength,
96            SelectRemove, SelectForm, SelectBlur, SelectType, SelectOptions,
97            SelectDisabled, SelectMultiple, SelectName, SelectSize, SelectFocus,
98            OptGroupDisabled, OptGroupLabel, OptionIndex, OptionSelected,
99            OptionForm, OptionText, OptionDefaultSelected, OptionDisabled,
100            OptionLabel, OptionValue, InputBlur, InputReadOnly, InputAccept,
101            InputSize, InputDefaultValue, InputTabIndex, InputValue, InputType,
102            InputFocus, InputMaxLength, InputDefaultChecked, InputDisabled,
103            InputChecked, InputForm, InputAccessKey, InputAlign, InputAlt,
104            InputName, InputSrc, InputUseMap, InputSelect, InputClick,
105            TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect,
106            TextAreaCols, TextAreaDisabled, TextAreaForm, TextAreaType,
107            TextAreaTabIndex, TextAreaReadOnly, TextAreaRows, TextAreaValue,
108            TextAreaBlur, TextAreaFocus, ButtonForm, ButtonTabIndex, ButtonName,
109            ButtonDisabled, ButtonAccessKey, ButtonType, ButtonValue, LabelHtmlFor,
110            LabelForm, LabelAccessKey, FieldSetForm, LegendForm, LegendAccessKey,
111            LegendAlign, UListType, UListCompact, OListStart, OListCompact,
112            OListType, DListCompact, DirectoryCompact, MenuCompact, LIType,
113            LIValue, DivAlign, ParagraphAlign, HeadingAlign, BlockQuoteCite,
114            QuoteCite, PreWidth, BRClear, BaseFontColor, BaseFontSize,
115            BaseFontFace, FontColor, FontSize, FontFace, HRWidth, HRNoShade,
116            HRAlign, HRSize, ModCite, ModDateTime, AnchorShape, AnchorRel,
117            AnchorAccessKey, AnchorCoords, AnchorHref, AnchorProtocol, AnchorHost,
118            AnchorCharset, AnchorHrefLang, AnchorHostname, AnchorType, AnchorFocus,
119            AnchorPort, AnchorPathName, AnchorHash, AnchorSearch, AnchorName,
120            AnchorRev, AnchorTabIndex, AnchorTarget, AnchorText, AnchorBlur, AnchorToString, 
121            ImageName, ImageAlign, ImageHspace, ImageVspace, ImageUseMap, ImageAlt,
122            ImageLowSrc, ImageWidth, ImageIsMap, ImageBorder, ImageHeight,
123            ImageLongDesc, ImageSrc, ImageX, ImageY, ObjectHspace, ObjectHeight, ObjectAlign,
124            ObjectBorder, ObjectCode, ObjectType, ObjectVspace, ObjectArchive,
125            ObjectDeclare, ObjectForm, ObjectCodeBase, ObjectCodeType, ObjectData,
126            ObjectName, ObjectStandby, ObjectTabIndex, ObjectUseMap, ObjectWidth, ObjectContentDocument,
127            ParamName, ParamType, ParamValueType, ParamValue, AppletArchive,
128            AppletAlt, AppletCode, AppletWidth, AppletAlign, AppletCodeBase,
129            AppletName, AppletHeight, AppletHspace, AppletObject, AppletVspace,
130            MapAreas, MapName, AreaHash, AreaHref, AreaTarget, AreaPort, AreaShape,
131            AreaCoords, AreaAlt, AreaAccessKey, AreaNoHref, AreaHost, AreaProtocol,
132            AreaHostName, AreaPathName, AreaSearch, AreaTabIndex, ScriptEvent,
133            ScriptType, ScriptHtmlFor, ScriptText, ScriptSrc, ScriptCharset,
134            ScriptDefer, 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, IFrameLongDesc, IFrameDocument, IFrameAlign,
153            IFrameFrameBorder, IFrameSrc, IFrameName, IFrameHeight,
154            IFrameMarginHeight, IFrameMarginWidth, IFrameScrolling, IFrameWidth, IFrameContentDocument, IFrameContentWindow,
155            MarqueeStart, MarqueeStop,
156            GetContext,
157            ElementInnerHTML, ElementTitle, ElementId, ElementDir, ElementLang,
158            ElementClassName, ElementInnerText, ElementDocument, ElementChildren, ElementContentEditable,
159            ElementIsContentEditable, ElementOuterHTML, ElementOuterText};
160
161     DOM::HTMLElement toElement() const { return static_cast<DOM::HTMLElement>(node); }
162   };
163
164
165   class HTMLElementFunction : public DOMFunction {
166   public:
167     HTMLElementFunction(ExecState *exec, int i, int len);
168     virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args);
169   private:
170     int id;
171   };
172
173   class HTMLCollection : public DOMObject {
174   public:
175     HTMLCollection(ExecState *exec, const DOM::HTMLCollection &c);
176     ~HTMLCollection();
177     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
178     virtual Value call(ExecState *exec, Object &thisObj, const List&args);
179     virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args);
180     virtual bool implementsCall() const { return true; }
181     virtual bool toBoolean(ExecState *) const { return true; }
182     virtual bool hasProperty(ExecState *exec, const Identifier &p) const;
183     enum { Item, NamedItem, Tags };
184     Value getNamedItems(ExecState *exec, const Identifier &propertyName) const;
185     virtual const ClassInfo* classInfo() const { return &info; }
186     static const ClassInfo info;
187     DOM::HTMLCollection toCollection() const { return collection; }
188   protected:
189     DOM::HTMLCollection collection;
190   };
191
192   class HTMLSelectCollection : public HTMLCollection {
193   public:
194     HTMLSelectCollection(ExecState *exec, const DOM::HTMLCollection &c, const DOM::HTMLSelectElement &e)
195       : HTMLCollection(exec, c), element(e) { }
196     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
197     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
198   private:
199     DOM::HTMLSelectElement element;
200   };
201
202   ////////////////////// Option Object ////////////////////////
203
204   class OptionConstructorImp : public ObjectImp {
205   public:
206     OptionConstructorImp(ExecState *exec, const DOM::Document &d);
207     virtual bool implementsConstruct() const;
208     virtual Object construct(ExecState *exec, const List &args);
209   private:
210     DOM::Document doc;
211   };
212
213   ////////////////////// Image Object ////////////////////////
214
215   class ImageConstructorImp : public ObjectImp {
216   public:
217     ImageConstructorImp(ExecState *exec, const DOM::Document &d);
218     virtual bool implementsConstruct() const;
219     virtual Object construct(ExecState *exec, const List &args);
220   private:
221     DOM::Document doc;
222   };
223
224   class Image : public DOMObject, public khtml::CachedObjectClient {
225   public:
226     Image(const DOM::Document &d, bool ws, int w, bool hs, int h);
227     ~Image();
228     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
229     Value getValueProperty(ExecState *exec, int token) const;
230     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
231     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
232     void notifyFinished(khtml::CachedObject *);
233     virtual bool toBoolean(ExecState *) const { return true; }
234     virtual const ClassInfo* classInfo() const { return &info; }
235     static const ClassInfo info;
236     enum { Src, Complete, OnLoad, Width, Height };
237     
238     khtml::CachedImage* image() { return img; }
239     
240   private:
241     UString src;
242     QGuardedPtr<DOM::DocumentImpl> doc;
243     khtml::CachedImage* img;
244     JSEventListener *onLoadListener;
245     bool widthSet;
246     bool heightSet;
247     int width;
248     int height;
249   };
250
251   ////////////////////// Context2D Object ////////////////////////
252
253   class Context2D : public DOMObject {
254   friend class Context2DFunction;
255   public:
256     Context2D(const DOM::HTMLElement &e);
257     ~Context2D();
258     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
259     Value getValueProperty(ExecState *exec, int token) const;
260     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
261     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
262     virtual bool toBoolean(ExecState *) const { return true; }
263     virtual const ClassInfo* classInfo() const { return &info; }
264     static const ClassInfo info;
265
266     enum { 
267         StrokeStyle,
268         FillStyle,
269         LineWidth,
270         LineCap,
271         LineJoin,
272         MiterLimit,
273         ShadowOffsetX,
274         ShadowOffsetY,
275         ShadowBlur,
276         ShadowColor,
277         GlobalAlpha,
278         GlobalCompositeOperation,
279         Save, Restore,
280         Scale, Rotate, Translate,
281         BeginPath, ClosePath, 
282         SetStrokeColor, SetFillColor, SetLineWidth, SetLineCap, SetLineJoin, SetMiterLimit, 
283         Fill, Stroke, 
284         MoveTo, LineTo, QuadraticCurveTo, BezierCurveTo, ArcTo, Arc, Rect, Clip,
285         ClearRect, FillRect, StrokeRect,
286         DrawImage, DrawImageFromRect,
287         SetShadow, ClearShadow,
288         SetAlpha, SetCompositeOperation,
289         CreateLinearGradient,
290         CreateRadialGradient,
291         CreatePattern
292     };
293
294     static CGColorRef Context2D::colorRefFromValue(ExecState *exec, const Value &value);
295     static QColor Context2D::colorFromValue(ExecState *exec, const Value &value);
296
297 private:
298     
299     void save();
300     void restore();
301     
302     CGContextRef drawingContext();
303     void setShadow(ExecState *exec);
304
305     DOM::HTMLElementImpl *_element;
306     unsigned int _needsFlushRasterCache;
307     
308     QPtrList<List> stateStack;
309     
310     ProtectedValue _strokeStyle;
311     ProtectedValue _fillStyle;
312     ProtectedValue _lineWidth;
313     ProtectedValue _lineCap;
314     ProtectedValue _lineJoin;
315     ProtectedValue _miterLimit;
316     ProtectedValue _shadowOffsetX;
317     ProtectedValue _shadowOffsetY;
318     ProtectedValue _shadowBlur;
319     ProtectedValue _shadowColor;
320     ProtectedValue _globalAlpha;
321     ProtectedValue _globalComposite;
322   };
323
324     struct ColorStop {
325         float stop;
326         float red;
327         float green;
328         float blue;
329         float alpha;
330         
331         ColorStop(float s, float r, float g, float b, float a) : stop(s), red(r), green(g), blue(b), alpha(a) {};
332     };
333
334
335   class Gradient : public DOMObject {
336   friend class Context2DFunction;
337   public:
338     //Gradient(const DOM::HTMLElement &e);
339     Gradient(float x0, float y0, float x1, float y1);
340     Gradient(float x0, float y0, float r0, float x1, float y1, float r1);
341     ~Gradient();
342     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
343     Value getValueProperty(ExecState *exec, int token) const;
344     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
345     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
346     virtual bool toBoolean(ExecState *) const { return true; }
347     virtual const ClassInfo* classInfo() const { return &info; }
348     static const ClassInfo info;
349
350     enum { 
351         AddColorStop
352     };
353     
354     enum {
355         Radial, Linear
356     };
357
358     CGShadingRef getShading();
359     
360     void addColorStop (float s, float r, float g, float b, float alpha);
361     const ColorStop *colorStops(int *count) const;
362     
363     int lastStop;
364     int nextStop;
365     
366 private:    
367     void commonInit();
368     
369     int _gradientType;
370     float _x0, _y0, _r0, _x1, _y1, _r1;
371     CGShadingRef _shadingRef;
372     
373     int maxStops;
374     int stopCount;
375     ColorStop *stops;
376     mutable int adjustedStopCount;
377     mutable ColorStop *adjustedStops;
378     mutable unsigned int stopsNeedAdjusting:1;
379     mutable unsigned int regenerateShading:1;
380   };
381
382   class ImagePattern : public DOMObject {
383   public:
384     ImagePattern(Image *i, int type);
385     ~ImagePattern();
386     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
387     Value getValueProperty(ExecState *exec, int token) const;
388     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
389     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
390     virtual bool toBoolean(ExecState *) const { return true; }
391     virtual const ClassInfo* classInfo() const { return &info; }
392     static const ClassInfo info;
393     
394     CGPatternRef getPattern() { return _patternRef; }
395     
396     QPixmap pixmap() { return _pixmap; }
397     
398     enum {
399         Repeat, RepeatX, RepeatY, NoRepeat
400     };
401     
402 private:
403     int _repetitionType;
404     QPixmap _pixmap;
405     CGPatternRef _patternRef;
406   };
407
408   Value getHTMLCollection(ExecState *exec, const DOM::HTMLCollection &c);
409   Value getSelectHTMLCollection(ExecState *exec, const DOM::HTMLCollection &c, const DOM::HTMLSelectElement &e);
410
411
412 }; // namespace
413
414 #endif