a4525f423cfc2e125e3cf5f3e93497753cf37cf4
[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 "URL.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 class EventSource final : public RefCounted<EventSource>, public EventTargetWithInlineData, private ThreadableLoaderClient, public ActiveDOMObject {
52     WTF_MAKE_FAST_ALLOCATED;
53 public:
54     static PassRefPtr<EventSource> create(ScriptExecutionContext&, const String& url, const Dictionary&, ExceptionCode&);
55     virtual ~EventSource();
56
57     static const unsigned long long defaultReconnectDelay;
58
59     String url() const;
60     bool withCredentials() const;
61
62     typedef short State;
63     static const State CONNECTING = 0;
64     static const State OPEN = 1;
65     static const State CLOSED = 2;
66
67     State readyState() const;
68
69     DEFINE_ATTRIBUTE_EVENT_LISTENER(open);
70     DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
71     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
72
73     void close();
74
75     using RefCounted<EventSource>::ref;
76     using RefCounted<EventSource>::deref;
77
78     virtual EventTargetInterface eventTargetInterface() const override { return EventSourceEventTargetInterfaceType; }
79     virtual ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
80
81 private:
82     EventSource(ScriptExecutionContext&, const URL&, const Dictionary&);
83
84     virtual void refEventTarget() override { ref(); }
85     virtual void derefEventTarget() override { deref(); }
86
87     virtual void didReceiveResponse(unsigned long, const ResourceResponse&) override;
88     virtual void didReceiveData(const char*, int) override;
89     virtual void didFinishLoading(unsigned long, double) override;
90     virtual void didFail(const ResourceError&) override;
91     virtual void didFailAccessControlCheck(const ResourceError&) override;
92     virtual void didFailRedirectCheck() override;
93
94     virtual void stop() override;
95
96     void connect();
97     void networkRequestEnded();
98     void scheduleInitialConnect();
99     void scheduleReconnect();
100     void connectTimerFired(Timer&);
101     void abortConnectionAttempt();
102     void parseEventStream();
103     void parseEventStreamLine(unsigned pos, int fieldLength, int lineLength);
104     PassRefPtr<MessageEvent> createMessageEvent();
105
106     URL m_url;
107     bool m_withCredentials;
108     State m_state;
109
110     RefPtr<TextResourceDecoder> m_decoder;
111     RefPtr<ThreadableLoader> m_loader;
112     Timer m_connectTimer;
113     Vector<UChar> m_receiveBuf;
114     bool m_discardTrailingNewline;
115     bool m_requestInFlight;
116
117     String m_eventName;
118     Vector<UChar> m_data;
119     String m_currentlyParsedEventId;
120     String m_lastEventId;
121     unsigned long long m_reconnectDelay;
122     String m_eventStreamOrigin;
123 };
124
125 } // namespace WebCore
126
127 #endif // EventSource_h