97e7c100f1a718c93f3fb62991eee98abcdd93e3
[WebKit-https.git] / Source / WebCore / page / EventSource.h
1 /*
2  * Copyright (C) 2009, 2012 Ericsson AB. All rights reserved.
3  * Copyright (C) 2010 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer
13  *    in the documentation and/or other materials provided with the
14  *    distribution.
15  * 3. Neither the name of Ericsson nor the names of its contributors
16  *    may be used to endorse or promote products derived from this
17  *    software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #ifndef EventSource_h
33 #define EventSource_h
34
35 #include "ActiveDOMObject.h"
36 #include "EventTarget.h"
37 #include "KURL.h"
38 #include "ThreadableLoaderClient.h"
39 #include "Timer.h"
40 #include <wtf/RefPtr.h>
41 #include <wtf/Vector.h>
42
43 namespace WebCore {
44
45 class Dictionary;
46 class MessageEvent;
47 class ResourceResponse;
48 class TextResourceDecoder;
49 class ThreadableLoader;
50
51 // FIXME: This class should be marked FINAL once <http://webkit.org/b/121747> is fixed.
52 class EventSource : public RefCounted<EventSource>, public EventTargetWithInlineData, private ThreadableLoaderClient, public ActiveDOMObject {
53     WTF_MAKE_FAST_ALLOCATED;
54 public:
55     static PassRefPtr<EventSource> create(ScriptExecutionContext*, const String& url, const Dictionary&, ExceptionCode&);
56     virtual ~EventSource();
57
58     static const unsigned long long defaultReconnectDelay;
59
60     String url() const;
61     bool withCredentials() const;
62
63     typedef short State;
64     static const State CONNECTING = 0;
65     static const State OPEN = 1;
66     static const State CLOSED = 2;
67
68     State readyState() const;
69
70     DEFINE_ATTRIBUTE_EVENT_LISTENER(open);
71     DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
72     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
73
74     void close();
75
76     using RefCounted<EventSource>::ref;
77     using RefCounted<EventSource>::deref;
78
79     virtual EventTargetInterface eventTargetInterface() const OVERRIDE FINAL { return EventSourceEventTargetInterfaceType; }
80     virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE FINAL { return ActiveDOMObject::scriptExecutionContext(); }
81
82 private:
83     EventSource(ScriptExecutionContext*, const KURL&, const Dictionary&);
84
85     virtual void refEventTarget() OVERRIDE FINAL { ref(); }
86     virtual void derefEventTarget() OVERRIDE FINAL { deref(); }
87
88     virtual void didReceiveResponse(unsigned long, const ResourceResponse&);
89     virtual void didReceiveData(const char*, int);
90     virtual void didFinishLoading(unsigned long, double);
91     virtual void didFail(const ResourceError&);
92     virtual void didFailAccessControlCheck(const ResourceError&);
93     virtual void didFailRedirectCheck();
94
95     virtual void stop() OVERRIDE;
96
97     void connect();
98     void networkRequestEnded();
99     void scheduleInitialConnect();
100     void scheduleReconnect();
101     void connectTimerFired(Timer<EventSource>*);
102     void abortConnectionAttempt();
103     void parseEventStream();
104     void parseEventStreamLine(unsigned pos, int fieldLength, int lineLength);
105     PassRefPtr<MessageEvent> createMessageEvent();
106
107     KURL m_url;
108     bool m_withCredentials;
109     State m_state;
110
111     RefPtr<TextResourceDecoder> m_decoder;
112     RefPtr<ThreadableLoader> m_loader;
113     Timer<EventSource> m_connectTimer;
114     Vector<UChar> m_receiveBuf;
115     bool m_discardTrailingNewline;
116     bool m_requestInFlight;
117
118     String m_eventName;
119     Vector<UChar> m_data;
120     String m_currentlyParsedEventId;
121     String m_lastEventId;
122     unsigned long long m_reconnectDelay;
123     String m_eventStreamOrigin;
124 };
125
126 } // namespace WebCore
127
128 #endif // EventSource_h