Reviewed by Eric Seidel.
[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  *  Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com>
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 _XMLHTTPREQUEST_H_
23 #define _XMLHTTPREQUEST_H_
24
25 #include <qguardedptr.h>
26 #include <qobject.h>
27 #include <kurl.h>
28 #include <qptrdict.h>
29
30 #include "kjs_dom.h"
31
32 namespace khtml {
33     class Decoder;
34 }
35
36 namespace KIO {
37     class Job;
38     class TransferJob;
39 }
40
41 namespace KJS {
42
43   class JSUnprotectedEventListener;
44   class XMLHttpRequestQObject;
45
46   // these exact numeric values are important because JS expects them
47   enum XMLHttpRequestState {
48     Uninitialized = 0,  // open() has not been called yet
49     Loading = 1,        // send() has not been called yet
50     Loaded = 2,         // send() has been called, headers and status are available
51     Interactive = 3,    // Downloading, responseText holds the partial data
52     Completed = 4       // Finished with all operations
53   };
54
55   class XMLHttpRequestConstructorImp : public JSObject {
56   public:
57     XMLHttpRequestConstructorImp(ExecState *exec, DOM::DocumentImpl *d);
58     ~XMLHttpRequestConstructorImp();
59     virtual bool implementsConstruct() const;
60     virtual JSObject *construct(ExecState *exec, const List &args);
61   private:
62     RefPtr<DOM::DocumentImpl> doc;
63   };
64
65   class XMLHttpRequest : public DOMObject {
66   public:
67     XMLHttpRequest(ExecState *, DOM::DocumentImpl *d);
68     ~XMLHttpRequest();
69     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
70     JSValue *getValueProperty(ExecState *exec, int token) const;
71     virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None);
72     void putValueProperty(ExecState *exec, int token, JSValue *value, int /*attr*/);
73     virtual bool toBoolean(ExecState *) const { return true; }
74     virtual void mark();
75
76     virtual const ClassInfo* classInfo() const { return &info; }
77     static const ClassInfo info;
78     enum { Onload, Onreadystatechange, ReadyState, ResponseText, ResponseXML, Status,
79         StatusText, Abort, GetAllResponseHeaders, GetResponseHeader, Open, Send, SetRequestHeader,
80         OverrideMIMEType };
81
82     static void cancelRequests(DOM::DocumentImpl *d);
83
84   private:
85     friend class XMLHttpRequestProtoFunc;
86     friend class XMLHttpRequestQObject;
87
88     JSValue *getStatusText() const;
89     JSValue *getStatus() const;
90     bool urlMatchesDocumentDomain(const KURL&) const;
91
92     XMLHttpRequestQObject *qObject;
93
94     void slotData( KIO::Job* job, const char *data, int size );
95     void slotFinished( KIO::Job* );
96     void slotRedirection( KIO::Job*, const KURL& );
97
98     void processSyncLoadResults(const QByteArray &data, const KURL &finalURL, const QString &headers);
99
100     void open(const QString& _method, const KURL& _url, bool _async);
101     void send(const QString& _body);
102     void abort();
103     void setRequestHeader(const QString& name, const QString &value);
104     QString getRequestHeader(const QString& name) const;
105     JSValue *getAllResponseHeaders() const;
106     QString getResponseHeader(const QString& name) const;
107     bool responseIsXML() const;
108     
109     static QString getSpecificHeader(const QString& headers, const QString& name);
110
111     void changeState(XMLHttpRequestState newState);
112
113     static QPtrDict< QPtrDict<XMLHttpRequest> > &requestsByDocument();
114     void addToRequestsByDocument();
115     void removeFromRequestsByDocument();
116
117     QGuardedPtr<DOM::DocumentImpl> doc;
118
119     KURL url;
120     QString method;
121     bool async;
122     QString requestHeaders;
123
124     KIO::TransferJob * job;
125
126     XMLHttpRequestState state;
127     RefPtr<JSUnprotectedEventListener> onReadyStateChangeListener;
128     RefPtr<JSUnprotectedEventListener> onLoadListener;
129
130     RefPtr<khtml::Decoder> decoder;
131     QString encoding;
132     QString responseHeaders;
133     QString MIMETypeOverride;
134
135     QString response;
136     mutable bool createdDocument;
137     mutable bool typeIsXML;
138     mutable RefPtr<DOM::DocumentImpl> responseXML;
139
140     bool aborted;
141   };
142
143
144   class XMLHttpRequestQObject : public QObject {
145     Q_OBJECT
146         
147   public:
148     XMLHttpRequestQObject(XMLHttpRequest *_jsObject);
149
150   public slots:
151     void slotData( KIO::Job* job, const char *data, int size );
152     void slotFinished( KIO::Job* job );
153     void slotRedirection( KIO::Job* job, const KURL& url);
154
155   private:
156     XMLHttpRequest *jsObject;
157   };
158
159 } // namespace
160
161 #endif