Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebCore / Modules / websockets / WebSocket.h
index 4f3ce72..5043c49 100644 (file)
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebSocket_h
-#define WebSocket_h
-
-#if ENABLE(WEB_SOCKETS)
+#pragma once
 
 #include "ActiveDOMObject.h"
-#include "EventListener.h"
 #include "EventTarget.h"
-#include "URL.h"
-#include "WebSocketChannel.h"
+#include "ExceptionOr.h"
+#include "Timer.h"
+#include <wtf/URL.h>
 #include "WebSocketChannelClient.h"
-#include <wtf/Forward.h>
-#include <wtf/RefCounted.h>
-#include <wtf/text/AtomicStringHash.h>
+#include <wtf/Deque.h>
+#include <wtf/HashSet.h>
+#include <wtf/Lock.h>
+
+namespace JSC {
+class ArrayBuffer;
+class ArrayBufferView;
+}
 
 namespace WebCore {
 
 class Blob;
 class ThreadableWebSocketChannel;
 
-class WebSocket final : public RefCounted<WebSocket>, public EventTargetWithInlineData, public ActiveDOMObject, public WebSocketChannelClient {
+class WebSocket final : public RefCounted<WebSocket>, public EventTargetWithInlineData, public ActiveDOMObject, private WebSocketChannelClient {
 public:
-    static void setIsAvailable(bool);
-    static bool isAvailable();
-    static const char* subProtocolSeperator();
-    static PassRefPtr<WebSocket> create(ScriptExecutionContext&);
-    static PassRefPtr<WebSocket> create(ScriptExecutionContext&, const String& url, ExceptionCode&);
-    static PassRefPtr<WebSocket> create(ScriptExecutionContext&, const String& url, const String& protocol, ExceptionCode&);
-    static PassRefPtr<WebSocket> create(ScriptExecutionContext&, const String& url, const Vector<String>& protocols, ExceptionCode&);
+    static const char* subprotocolSeparator();
+
+    static ExceptionOr<Ref<WebSocket>> create(ScriptExecutionContext&, const String& url);
+    static ExceptionOr<Ref<WebSocket>> create(ScriptExecutionContext&, const String& url, const String& protocol);
+    static ExceptionOr<Ref<WebSocket>> create(ScriptExecutionContext&, const String& url, const Vector<String>& protocols);
     virtual ~WebSocket();
 
+    static HashSet<WebSocket*>& allActiveWebSockets(const LockHolder&);
+    static Lock& allActiveWebSocketsMutex();
+
     enum State {
         CONNECTING = 0,
         OPEN = 1,
@@ -66,84 +69,80 @@ public:
         CLOSED = 3
     };
 
-    void connect(const String& url, ExceptionCode&);
-    void connect(const String& url, const String& protocol, ExceptionCode&);
-    void connect(const String& url, const Vector<String>& protocols, ExceptionCode&);
+    ExceptionOr<void> connect(const String& url);
+    ExceptionOr<void> connect(const String& url, const String& protocol);
+    ExceptionOr<void> connect(const String& url, const Vector<String>& protocols);
 
-    void send(const String& message, ExceptionCode&);
-    void send(JSC::ArrayBuffer*, ExceptionCode&);
-    void send(JSC::ArrayBufferView*, ExceptionCode&);
-    void send(Blob*, ExceptionCode&);
+    ExceptionOr<void> send(const String& message);
+    ExceptionOr<void> send(JSC::ArrayBuffer&);
+    ExceptionOr<void> send(JSC::ArrayBufferView&);
+    ExceptionOr<void> send(Blob&);
 
-    void close(int code, const String& reason, ExceptionCode&);
-    void close(ExceptionCode& ec) { close(WebSocketChannel::CloseEventCodeNotSpecified, String(), ec); }
-    void close(int code, ExceptionCode& ec) { close(code, String(), ec); }
+    ExceptionOr<void> close(std::optional<unsigned short> code, const String& reason);
+
+    RefPtr<ThreadableWebSocketChannel> channel() const;
 
     const URL& url() const;
     State readyState() const;
-    unsigned long bufferedAmount() const;
+    unsigned bufferedAmount() const;
 
     String protocol() const;
     String extensions() const;
 
     String binaryType() const;
-    void setBinaryType(const String&);
-
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(open);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
-
-    // EventTarget functions.
-    virtual EventTargetInterface eventTargetInterface() const override;
-    virtual ScriptExecutionContext* scriptExecutionContext() const override;
+    ExceptionOr<void> setBinaryType(const String&);
 
-    using RefCounted<WebSocket>::ref;
-    using RefCounted<WebSocket>::deref;
+    ScriptExecutionContext* scriptExecutionContext() const final;
 
-    // WebSocketChannelClient functions.
-    virtual void didConnect() override;
-    virtual void didReceiveMessage(const String& message) override;
-    virtual void didReceiveBinaryData(PassOwnPtr<Vector<char>>) override;
-    virtual void didReceiveMessageError() override;
-    virtual void didUpdateBufferedAmount(unsigned long bufferedAmount) override;
-    virtual void didStartClosingHandshake() override;
-    virtual void didClose(unsigned long unhandledBufferedAmount, ClosingHandshakeCompletionStatus, unsigned short code, const String& reason) override;
+    using RefCounted::ref;
+    using RefCounted::deref;
 
 private:
     explicit WebSocket(ScriptExecutionContext&);
 
-    // ActiveDOMObject functions.
-    virtual void contextDestroyed() override;
-    virtual bool canSuspend() const override;
-    virtual void suspend(ReasonForSuspension) override;
-    virtual void resume() override;
-    virtual void stop() override;
-    virtual const char* activeDOMObjectName() const override { return "WebSocket"; }
+    void resumeTimerFired();
+    void dispatchOrQueueErrorEvent();
+    void dispatchOrQueueEvent(Ref<Event>&&);
 
-    virtual void refEventTarget() override { ref(); }
-    virtual void derefEventTarget() override { deref(); }
+    void contextDestroyed() final;
+    bool canSuspendForDocumentSuspension() const final;
+    void suspend(ReasonForSuspension) final;
+    void resume() final;
+    void stop() final;
+    const char* activeDOMObjectName() const final;
+
+    EventTargetInterface eventTargetInterface() const final;
+
+    void refEventTarget() final { ref(); }
+    void derefEventTarget() final { deref(); }
+
+    void didConnect() final;
+    void didReceiveMessage(const String& message) final;
+    void didReceiveBinaryData(Vector<uint8_t>&&) final;
+    void didReceiveMessageError() final;
+    void didUpdateBufferedAmount(unsigned bufferedAmount) final;
+    void didStartClosingHandshake() final;
+    void didClose(unsigned unhandledBufferedAmount, ClosingHandshakeCompletionStatus, unsigned short code, const String& reason) final;
+    void didUpgradeURL() final;
 
     size_t getFramingOverhead(size_t payloadSize);
 
-    enum BinaryType {
-        BinaryTypeBlob,
-        BinaryTypeArrayBuffer
-    };
+    enum class BinaryType { Blob, ArrayBuffer };
 
     RefPtr<ThreadableWebSocketChannel> m_channel;
 
-    State m_state;
+    State m_state { CONNECTING };
     URL m_url;
-    unsigned long m_bufferedAmount;
-    unsigned long m_bufferedAmountAfterClose;
-    BinaryType m_binaryType;
+    unsigned m_bufferedAmount { 0 };
+    unsigned m_bufferedAmountAfterClose { 0 };
+    BinaryType m_binaryType { BinaryType::Blob };
     String m_subprotocol;
     String m_extensions;
+
+    Timer m_resumeTimer;
+    bool m_shouldDelayEventFiring { false };
+    Deque<Ref<Event>> m_pendingEvents;
+    bool m_dispatchedErrorEvent { false };
 };
 
 } // namespace WebCore
-
-#endif // ENABLE(WEB_SOCKETS)
-
-#endif // WebSocket_h