5a727c54aa361ebf88e1950fe5d675e25e28b8a6
[WebKit-https.git] / WebCore / khtml / html / html_formimpl.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2000 Dirk Mueller (mueller@kde.org)
7  * Copyright (C) 2004 Apple Computer, Inc.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  *
24  */
25 #ifndef HTML_FORMIMPL_H
26 #define HTML_FORMIMPL_H
27
28 #include "html/html_elementimpl.h"
29 #include "dom/html_element.h"
30
31 #include <qptrvector.h>
32 #include <qmemarray.h>
33
34 class KHTMLView;
35 class QTextCodec;
36
37 namespace khtml
38 {
39     class FormData;
40     class RenderFormElement;
41     class RenderTextArea;
42     class RenderSelect;
43     class RenderLineEdit;
44     class RenderRadioButton;
45     class RenderFileButton;
46 #if APPLE_CHANGES
47     class RenderSlider;
48 #endif
49 }
50
51 namespace DOM {
52
53 class DOMString;
54 class FormDataList;
55 class HTMLFormElement;
56 class HTMLGenericFormElementImpl;
57 class HTMLImageElementImpl;
58 class HTMLImageLoader;
59 class HTMLOptionElementImpl;
60 class HTMLOptionsCollectionImpl;
61
62 // -------------------------------------------------------------------------
63
64 class HTMLFormElementImpl : public HTMLElementImpl
65 {
66 public:
67     HTMLFormElementImpl(DocumentPtr *doc);
68     virtual ~HTMLFormElementImpl();
69
70     virtual Id id() const;
71
72     virtual void attach();
73     virtual void detach();
74
75     long length() const;
76
77     DOMString enctype() const { return m_enctype; }
78     void setEnctype( const DOMString & );
79
80     DOMString boundary() const { return m_boundary; }
81     void setBoundary( const DOMString & );
82
83     bool autoComplete() const { return m_autocomplete; }
84
85     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
86
87     void radioClicked( HTMLGenericFormElementImpl *caller );
88
89     void registerFormElement(HTMLGenericFormElementImpl *);
90     void removeFormElement(HTMLGenericFormElementImpl *);
91     void makeFormElementDormant(HTMLGenericFormElementImpl *);
92     void registerImgElement(HTMLImageElementImpl *);
93     void removeImgElement(HTMLImageElementImpl *);
94
95     bool prepareSubmit();
96     void submit(bool activateSubmitButton);
97     void reset();
98
99     void setMalformed(bool malformed) { m_malformed = malformed; }
100     virtual bool isMalformed() { return m_malformed; }
101     
102     virtual bool isURLAttribute(AttributeImpl *attr) const;
103     
104 #if APPLE_CHANGES
105     void submitClick();
106     bool formWouldHaveSecureSubmission(const DOMString &url);
107 #endif
108    
109     static void i18nData();
110
111     friend class HTMLFormElement;
112     friend class HTMLFormCollectionImpl;
113
114     QPtrVector<HTMLGenericFormElementImpl> formElements;
115     QPtrVector<HTMLGenericFormElementImpl> dormantFormElements;
116     QPtrVector<HTMLImageElementImpl> imgElements;
117     DOMString m_url;
118     DOMString m_target;
119     DOMString m_enctype;
120     DOMString m_boundary;
121     DOMString m_acceptcharset;
122     bool m_post : 1;
123     bool m_multipart : 1;
124     bool m_autocomplete : 1;
125     bool m_insubmit : 1;
126     bool m_doingsubmit : 1;
127     bool m_inreset : 1;
128     bool m_malformed : 1;
129
130  private:
131     bool formData(khtml::FormData &) const;
132
133     QString oldIdAttr;
134     QString oldNameAttr;
135 };
136
137 // -------------------------------------------------------------------------
138
139 class HTMLGenericFormElementImpl : public HTMLElementImpl
140 {
141     friend class HTMLFormElementImpl;
142     friend class khtml::RenderFormElement;
143
144 public:
145     HTMLGenericFormElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
146     virtual ~HTMLGenericFormElementImpl();
147
148     HTMLFormElementImpl *form() { return m_form; }
149
150     virtual DOMString type() const = 0;
151
152     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
153     virtual void attach();
154     virtual void insertedIntoDocument();
155     virtual void removedFromDocument();
156
157     virtual void reset() {}
158
159     void onSelect();
160     void onChange();
161
162     virtual bool disabled() const;
163     void setDisabled(bool _disabled);
164
165     virtual bool isFocusable() const;
166     virtual bool isKeyboardFocusable() const;
167     virtual bool isMouseFocusable() const;
168     virtual bool isEnumeratable() const { return false; }
169
170     bool readOnly() const { return m_readOnly; }
171     void setReadOnly(bool _readOnly) { m_readOnly = _readOnly; }
172
173     virtual void recalcStyle( StyleChange );
174
175     DOMString name() const;
176     void setName(const DOMString& name);
177
178     virtual bool isGenericFormElement() const { return true; }
179
180     /*
181      * override in derived classes to get the encoded name=value pair
182      * for submitting
183      * return true for a successful control (see HTML4-17.13.2)
184      */
185     virtual bool appendFormData(FormDataList&, bool) { return false; }
186
187     virtual void defaultEventHandler(EventImpl *evt);
188     virtual bool isEditable();
189
190     virtual QString state();
191     QString findMatchingState(QStringList &states);
192
193     virtual bool isSuccessfulSubmitButton() const { return false; }
194     virtual bool isActivatedSubmit() const { return false; }
195     virtual void setActivatedSubmit(bool flag) { }
196
197 protected:
198     HTMLFormElementImpl *getForm() const;
199
200     DOMStringImpl* m_name;
201     HTMLFormElementImpl *m_form;
202     bool m_disabled, m_readOnly;
203
204     bool m_inited : 1;
205     bool m_dormant : 1;
206 };
207
208 // -------------------------------------------------------------------------
209
210 class HTMLButtonElementImpl : public HTMLGenericFormElementImpl
211 {
212 public:
213     HTMLButtonElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
214
215     virtual ~HTMLButtonElementImpl();
216
217     enum typeEnum {
218         SUBMIT,
219         RESET,
220         BUTTON
221     };
222
223     virtual Id id() const;
224     DOMString type() const;
225
226     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
227     virtual void defaultEventHandler(EventImpl *evt);
228     virtual bool appendFormData(FormDataList&, bool);
229
230     virtual bool isSuccessfulSubmitButton() const;
231     virtual bool isActivatedSubmit() const;
232     virtual void setActivatedSubmit(bool flag);
233
234     virtual void click();
235     virtual void accessKeyAction();
236     
237 protected:
238     DOMString m_value;
239     DOMString m_currValue;
240     typeEnum  m_type : 2;
241     bool      m_dirty : 1;
242     bool      m_activeSubmit : 1;
243 };
244
245 // -------------------------------------------------------------------------
246
247 class HTMLFieldSetElementImpl : public HTMLGenericFormElementImpl
248 {
249 public:
250     HTMLFieldSetElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
251
252     virtual ~HTMLFieldSetElementImpl();
253
254     virtual Id id() const;
255     
256     virtual bool isFocusable() const;
257     
258     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
259
260     virtual DOMString type() const;
261 };
262
263 // -------------------------------------------------------------------------
264
265 class HTMLInputElementImpl : public HTMLGenericFormElementImpl
266 {
267     friend class khtml::RenderLineEdit;
268     friend class khtml::RenderRadioButton;
269     friend class khtml::RenderFileButton;
270
271 #if APPLE_CHANGES
272     friend class HTMLSelectElementImpl;
273     friend class khtml::RenderSlider;
274 #endif
275
276 public:
277     // do not change the order!
278     enum typeEnum {
279         TEXT,
280         PASSWORD,
281         ISINDEX,
282         CHECKBOX,
283         RADIO,
284         SUBMIT,
285         RESET,
286         FILE,
287         HIDDEN,
288         IMAGE,
289         BUTTON
290 #if APPLE_CHANGES
291         ,SEARCH,
292         RANGE
293 #endif
294     };
295
296     HTMLInputElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
297     virtual ~HTMLInputElementImpl();
298
299     virtual Id id() const;
300
301     virtual bool isEnumeratable() const { return inputType() != IMAGE; }
302
303     bool autoComplete() const { return m_autocomplete; }
304
305     bool checked() const { return m_checked; }
306     void setChecked(bool);
307     long maxLength() const { return m_maxLen; }
308     int size() const { return m_size; }
309     DOMString type() const;
310     void setType(const DOMString& t);
311
312     DOMString value() const;
313     void setValue(const DOMString &);
314
315     void blur();
316     void focus();
317
318     virtual bool maintainsState() { return m_type != PASSWORD; }
319     virtual QString state();
320     virtual void restoreState(QStringList &);
321
322     void select();
323     
324     virtual void click();
325     virtual void accessKeyAction();
326
327     virtual bool mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const;
328     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
329
330     virtual void attach();
331     virtual bool rendererIsNeeded(khtml::RenderStyle *);
332     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
333     virtual bool appendFormData(FormDataList&, bool);
334
335     virtual bool isSuccessfulSubmitButton() const;
336     virtual bool isActivatedSubmit() const;
337     virtual void setActivatedSubmit(bool flag);
338
339     typeEnum inputType() const { return m_type; }
340     virtual void reset();
341
342     // used in case input type=image was clicked.
343     int clickX() const { return xPos; }
344     int clickY() const { return yPos; }
345
346     virtual void defaultEventHandler(EventImpl *evt);
347     virtual bool isEditable();
348
349     DOMString altText() const;
350     
351     virtual bool isURLAttribute(AttributeImpl *attr) const;
352
353 #if APPLE_CHANGES
354     long maxResults() const { return m_maxResults; }
355 #endif
356     
357 protected:
358     bool storesValueSeparateFromAttribute() const;
359
360     DOMString m_value;
361     int       xPos;
362     short     m_maxLen;
363     short     m_size;
364     short     yPos;
365
366 #if APPLE_CHANGES
367     short     m_maxResults;
368 #endif
369
370     HTMLImageLoader* m_imageLoader;
371
372     typeEnum m_type : 4;
373     bool m_checked : 1;
374     bool m_defaultChecked : 1;
375     bool m_useDefaultChecked : 1;
376     bool m_haveType : 1;
377     bool m_activeSubmit : 1;
378     bool m_autocomplete : 1;
379 };
380
381 // -------------------------------------------------------------------------
382
383 class HTMLLabelElementImpl : public HTMLElementImpl
384 {
385 public:
386     HTMLLabelElementImpl(DocumentPtr *doc);
387     virtual ~HTMLLabelElementImpl();
388
389     virtual bool isFocusable() const;
390     
391     virtual Id id() const;
392
393     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
394
395     virtual void accessKeyAction();
396
397     /**
398      * the form element this label is associated to.
399      */
400     ElementImpl *formElement();
401
402  private:
403     DOMString m_formElementID;
404 };
405
406 // -------------------------------------------------------------------------
407
408 class HTMLLegendElementImpl : public HTMLGenericFormElementImpl
409 {
410 public:
411     HTMLLegendElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
412     virtual ~HTMLLegendElementImpl();
413
414     virtual bool isFocusable() const;
415     
416     virtual Id id() const;
417     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
418
419     virtual DOMString type() const;
420 };
421
422 // -------------------------------------------------------------------------
423
424 class HTMLSelectElementImpl : public HTMLGenericFormElementImpl
425 {
426     friend class khtml::RenderSelect;
427
428 public:
429     HTMLSelectElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
430     ~HTMLSelectElementImpl();
431
432     virtual Id id() const;
433     DOMString type() const;
434
435     virtual void recalcStyle( StyleChange );
436
437     long selectedIndex() const;
438     void setSelectedIndex( long index );
439
440     virtual bool isEnumeratable() const { return true; }
441
442     long length() const;
443
444     long minWidth() const { return m_minwidth; }
445
446     long size() const { return m_size; }
447
448     bool multiple() const { return m_multiple; }
449
450     void add ( HTMLElementImpl *element, HTMLElementImpl *before );
451     void remove ( long index );
452     void blur();
453     void focus();
454
455     DOMString value();
456     void setValue(DOMStringImpl* value);
457     
458     HTMLOptionsCollectionImpl *options();
459
460     virtual bool maintainsState() { return true; }
461     virtual QString state();
462     virtual void restoreState(QStringList &);
463
464     virtual NodeImpl *insertBefore ( NodeImpl *newChild, NodeImpl *refChild, int &exceptioncode );
465     virtual NodeImpl *replaceChild ( NodeImpl *newChild, NodeImpl *oldChild, int &exceptioncode );
466     virtual NodeImpl *removeChild ( NodeImpl *oldChild, int &exceptioncode );
467     virtual NodeImpl *appendChild ( NodeImpl *newChild, int &exceptioncode );
468     virtual NodeImpl *addChild( NodeImpl* newChild );
469
470     virtual void childrenChanged();
471
472     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
473
474     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
475     virtual bool appendFormData(FormDataList&, bool);
476
477     // get the actual listbox index of the optionIndexth option
478     int optionToListIndex(int optionIndex) const;
479     // reverse of optionToListIndex - get optionIndex from listboxIndex
480     int listToOptionIndex(int listIndex) const;
481
482     void setRecalcListItems();
483
484     QMemArray<HTMLGenericFormElementImpl*> listItems() const
485      {
486          if (m_recalcListItems) const_cast<HTMLSelectElementImpl*>(this)->recalcListItems();
487          return m_listItems;
488      }
489     virtual void reset();
490     void notifyOptionSelected(HTMLOptionElementImpl *selectedOption, bool selected);
491
492 #if APPLE_CHANGES
493     virtual void defaultEventHandler(EventImpl *evt);
494 #endif
495
496     virtual void accessKeyAction();
497
498 private:
499     void recalcListItems();
500
501 protected:
502     mutable QMemArray<HTMLGenericFormElementImpl*> m_listItems;
503     HTMLOptionsCollectionImpl *m_options;
504     short m_minwidth;
505     short m_size;
506     bool m_multiple;
507     bool m_recalcListItems;
508 };
509
510 // -------------------------------------------------------------------------
511
512 class HTMLKeygenElementImpl : public HTMLSelectElementImpl
513 {
514 public:
515     HTMLKeygenElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
516
517     virtual Id id() const;
518
519     DOMString type() const;
520
521     // ### this is just a rough guess
522     virtual bool isEnumeratable() const { return false; }
523
524     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
525     virtual bool appendFormData(FormDataList&, bool);
526 protected:
527     AtomicString m_challenge;
528     AtomicString m_keyType;
529 };
530
531 // -------------------------------------------------------------------------
532
533 class HTMLOptGroupElementImpl : public HTMLGenericFormElementImpl
534 {
535 public:
536     HTMLOptGroupElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
537     virtual ~HTMLOptGroupElementImpl();
538
539     virtual Id id() const;
540     DOMString type() const;
541
542     virtual bool isFocusable() const;
543     
544     virtual NodeImpl *insertBefore ( NodeImpl *newChild, NodeImpl *refChild, int &exceptioncode );
545     virtual NodeImpl *replaceChild ( NodeImpl *newChild, NodeImpl *oldChild, int &exceptioncode );
546     virtual NodeImpl *removeChild ( NodeImpl *oldChild, int &exceptioncode );
547     virtual NodeImpl *appendChild ( NodeImpl *newChild, int &exceptioncode );
548     virtual NodeImpl *addChild( NodeImpl* newChild );
549     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
550     void recalcSelectOptions();
551
552 };
553
554
555 // ---------------------------------------------------------------------------
556
557 class HTMLOptionElementImpl : public HTMLGenericFormElementImpl
558 {
559     friend class khtml::RenderSelect;
560     friend class DOM::HTMLSelectElementImpl;
561
562 public:
563     HTMLOptionElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
564
565     virtual bool isFocusable() const;
566     
567     virtual Id id() const;
568     DOMString type() const;
569
570     DOMString text() const;
571
572     long index() const;
573     void setIndex( long );
574     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
575     DOMString value() const;
576     void setValue(DOMStringImpl* value);
577
578     bool selected() const { return m_selected; }
579     void setSelected(bool _selected);
580
581     HTMLSelectElementImpl *getSelect() const;
582
583     virtual void childrenChanged();
584
585 protected:
586     DOMString m_value;
587     bool m_selected;
588 };
589
590
591 // -------------------------------------------------------------------------
592
593 class HTMLTextAreaElementImpl : public HTMLGenericFormElementImpl
594 {
595     friend class khtml::RenderTextArea;
596
597 public:
598     enum WrapMethod {
599         ta_NoWrap,
600         ta_Virtual,
601         ta_Physical
602     };
603
604     HTMLTextAreaElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
605     ~HTMLTextAreaElementImpl();
606
607     virtual Id id() const;
608
609     long cols() const { return m_cols; }
610
611     long rows() const { return m_rows; }
612
613     WrapMethod wrap() const { return m_wrap; }
614
615     virtual bool isEnumeratable() const { return true; }
616
617     DOMString type() const;
618
619     virtual bool maintainsState() { return true; }
620     virtual QString state();
621     virtual void restoreState(QStringList &);
622
623     void select (  );
624
625     virtual void childrenChanged();
626     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
627     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
628     virtual bool appendFormData(FormDataList&, bool);
629     virtual void reset();
630     DOMString value();
631     void setValue(DOMString _value);
632     DOMString defaultValue();
633     void setDefaultValue(DOMString _defaultValue);
634     void blur();
635     void focus();
636
637     virtual bool isEditable();
638     
639     virtual void accessKeyAction();
640     
641 protected:
642     int m_rows;
643     int m_cols;
644     WrapMethod m_wrap;
645     QString m_value;
646     bool m_dirtyvalue;
647 };
648
649 // -------------------------------------------------------------------------
650
651 class HTMLIsIndexElementImpl : public HTMLInputElementImpl
652 {
653 public:
654     HTMLIsIndexElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f = 0);
655
656     virtual Id id() const;
657     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
658
659 protected:
660     DOMString m_prompt;
661 };
662
663 // -------------------------------------------------------------------------
664
665 class HTMLOptionsCollectionImpl : public khtml::Shared<HTMLOptionsCollectionImpl>
666 {
667 public:
668     HTMLOptionsCollectionImpl(HTMLSelectElementImpl *impl) : m_select(impl) { }
669
670     unsigned long length() const;
671     void setLength(unsigned long);
672     NodeImpl *item(unsigned long index) const;
673     NodeImpl *namedItem(const DOMString &name) const;
674
675     void detach() { m_select = 0; }
676
677 private:
678     HTMLSelectElementImpl *m_select;
679 };
680
681 } //namespace
682
683 #endif