Reviewed by John.
[WebKit-https.git] / WebCore / khtml / ecma / xmlhttprequest.h
1 // -*- c-basic-offset: 2 -*-
2 /*
3  *  This file is part of the KDE libraries
4  *  Copyright (C) 2003 Apple Computer, Inc.
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public
8  *  License as published by the Free Software Foundation; either
9  *  version 2 of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #ifndef _XMLHTTPREQUEST_H_
22 #define _XMLHTTPREQUEST_H_
23
24 #include "ecma/kjs_binding.h"
25 #include "ecma/kjs_dom.h"
26 #include "misc/decoder.h"
27 #include "kio/jobclasses.h"
28
29 namespace KJS {
30
31   class JSEventListener;
32   class XMLHttpRequestQObject;
33
34   // these exact numeric values are important because JS expects them
35   enum XMLHttpRequestState {
36     Uninitialized = 0,
37     Loading = 1,
38     Loaded = 2,
39     Interactive = 3,
40     Completed = 4
41   };
42
43   class XMLHttpRequestConstructorImp : public ObjectImp {
44   public:
45     XMLHttpRequestConstructorImp(ExecState *exec, const DOM::Document &d);
46     virtual bool implementsConstruct() const;
47     virtual Object construct(ExecState *exec, const List &args);
48   private:
49     DOM::Document doc;
50   };
51
52   class XMLHttpRequest : public DOMObject {
53   public:
54     XMLHttpRequest(ExecState *, const DOM::Document &d);
55     ~XMLHttpRequest();
56     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
57     Value getValueProperty(ExecState *exec, int token) const;
58     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
59     void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
60     virtual bool toBoolean(ExecState *) const { return true; }
61     virtual const ClassInfo* classInfo() const { return &info; }
62     static const ClassInfo info;
63     enum { Onload, Onreadystatechange, ReadyState, ResponseText, ResponseXML, Status, StatusText, Abort, GetAllResponseHeaders, GetResponseHeader, Open, Send, SetRequestHeader };
64
65   private:
66     friend class XMLHttpRequestProtoFunc;
67     friend class XMLHttpRequestQObject;
68
69     Value getStatusText() const;
70     Value getStatus() const;
71     bool urlMatchesDocumentDomain(const KURL&) const;
72
73     XMLHttpRequestQObject *qObject;
74
75 #if APPLE_CHANGES
76     void slotData( KIO::Job* job, const char *data, int size );
77 #else
78     void slotData( KIO::Job* job, const QByteArray &data );
79 #endif
80     void slotFinished( KIO::Job* );
81     void slotRedirection( KIO::Job*, const KURL& );
82
83     void open(const QString& _method, const KURL& _url, bool _async);
84     void send(const QString& _body);
85     void abort();
86     void setRequestHeader(const QString& name, const QString &value);
87     Value getAllResponseHeaders() const;
88     Value getResponseHeader(const QString& name) const;
89
90     void changeState(XMLHttpRequestState newState);
91
92     QGuardedPtr<DOM::DocumentImpl> doc;
93
94     KURL url;
95     QString method;
96     bool async;
97     QString requestHeaders;
98
99     KIO::TransferJob * job;
100
101     XMLHttpRequestState state;
102     JSEventListener *onReadyStateChangeListener;
103     JSEventListener *onLoadListener;
104
105     khtml::Decoder *decoder;
106     QString encoding;
107     QString responseHeaders;
108
109     QString response;
110     mutable bool createdDocument;
111     mutable DOM::Document responseXML;
112   };
113
114
115   class XMLHttpRequestQObject : public QObject {
116     Q_OBJECT
117         
118   public:
119     XMLHttpRequestQObject(XMLHttpRequest *_jsObject);
120
121   public slots:
122 #if APPLE_CHANGES
123     void slotData( KIO::Job* job, const char *data, int size );
124 #else
125     void slotData( KIO::Job* job, const QByteArray &data );
126 #endif
127     void slotFinished( KIO::Job* job );
128     void slotRedirection( KIO::Job* job, const KURL& url);
129
130   private:
131     XMLHttpRequest *jsObject;
132   };
133
134 }; // namespace
135
136 #endif