diff options
author | ukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-21 09:17:26 +0000 |
---|---|---|
committer | ukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-21 09:17:26 +0000 |
commit | 4644c7573d32f1064106557c0772c99b964b09c0 (patch) | |
tree | 12697bad6a18c25a34e6a49c535cf03ca2cade80 /webkit/api | |
parent | 329f3e727ee9a3ab5fd27bba7f2fc08c4c620d7b (diff) | |
download | chromium_src-4644c7573d32f1064106557c0772c99b964b09c0.zip chromium_src-4644c7573d32f1064106557c0772c99b964b09c0.tar.gz chromium_src-4644c7573d32f1064106557c0772c99b964b09c0.tar.bz2 |
Enable WebSocket in test_shell
BUG=12497,24756
TEST=LayoutTests/fast/websockets success
Review URL: http://codereview.chromium.org/243108
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29626 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/api')
-rw-r--r-- | webkit/api/public/WebKitClient.h | 4 | ||||
-rw-r--r-- | webkit/api/public/WebSocketStreamError.h | 45 | ||||
-rw-r--r-- | webkit/api/public/WebSocketStreamHandle.h | 57 | ||||
-rw-r--r-- | webkit/api/public/WebSocketStreamHandleClient.h | 66 | ||||
-rw-r--r-- | webkit/api/src/SocketStreamHandle.cpp | 155 |
5 files changed, 317 insertions, 10 deletions
diff --git a/webkit/api/public/WebKitClient.h b/webkit/api/public/WebKitClient.h index 6f2b3dd..905355f 100644 --- a/webkit/api/public/WebKitClient.h +++ b/webkit/api/public/WebKitClient.h @@ -50,6 +50,7 @@ namespace WebKit { class WebMimeRegistry; class WebPluginListBuilder; class WebSandboxSupport; + class WebSocketStreamHandle; class WebStorageNamespace; class WebString; class WebThemeEngine; @@ -166,6 +167,9 @@ namespace WebKit { // Returns a new WebURLLoader instance. virtual WebURLLoader* createURLLoader() = 0; + // Returns a new WebSocketStreamHandle instance. + virtual WebSocketStreamHandle* createSocketStreamHandle() = 0; + // Plugins ------------------------------------------------------------- diff --git a/webkit/api/public/WebSocketStreamError.h b/webkit/api/public/WebSocketStreamError.h new file mode 100644 index 0000000..72e8f3c --- /dev/null +++ b/webkit/api/public/WebSocketStreamError.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2009 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef WebSocketStreamError_h +#define WebSocketStreamError_h + +#include "WebCommon.h" + +namespace WebKit { + + class WebSocketStreamError { + public: + // FIXME: Define SocketStream Error codes and accessor methods. + }; + +} // namespace WebKit + +#endif diff --git a/webkit/api/public/WebSocketStreamHandle.h b/webkit/api/public/WebSocketStreamHandle.h new file mode 100644 index 0000000..909e317 --- /dev/null +++ b/webkit/api/public/WebSocketStreamHandle.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2009 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef WebSocketStreamHandle_h +#define WebSocketStreamHandle_h + +#include "WebCommon.h" + +namespace WebKit { + class WebData; + class WebSocketStreamHandleClient; + class WebURL; + + class WebSocketStreamHandle { + public: + virtual ~WebSocketStreamHandle() { } + + // Connect new socket stream asynchronously. + virtual void connect(const WebURL&, WebSocketStreamHandleClient*) = 0; + + // Send web socket frame data on the socket stream. + virtual bool send(const WebData&) = 0; + + // Close the socket stream. + virtual void close() = 0; + }; + +} // namespace WebKit + +#endif diff --git a/webkit/api/public/WebSocketStreamHandleClient.h b/webkit/api/public/WebSocketStreamHandleClient.h new file mode 100644 index 0000000..34a1494 --- /dev/null +++ b/webkit/api/public/WebSocketStreamHandleClient.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2009 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef WebSocketStreamHandleClient_h +#define WebSocketStreamHandleClient_h + +#include "WebCommon.h" + +namespace WebKit { + class WebData; + class WebSocketStreamError; + + class WebSocketStreamHandleClient { + public: + + // Called when WebSocketStreamHandle is going to open the URL. + virtual void willOpenStream(WebSocketStreamHandle*, const WebURL&) = 0; + + // Called when Socket Stream is opened. + virtual void didOpenStream(WebSocketStreamHandle*, int /* maxPendingSendAllowed */) = 0; + + // Called when |amountSent| bytes are sent. + virtual void didSendData(WebSocketStreamHandle*, int /* amountSent */) = 0; + + // Called when data are received. + virtual void didReceiveData(WebSocketStreamHandle*, const WebData&) = 0; + + // Called when Socket Stream is closed. + virtual void didClose(WebSocketStreamHandle*) = 0; + + // Called when Socket Stream has an error. + virtual void didFail(WebSocketStreamHandle*, const WebSocketStreamError&) = 0; + + // FIXME: auth challenge for proxy + }; + +} // namespace WebKit + +#endif diff --git a/webkit/api/src/SocketStreamHandle.cpp b/webkit/api/src/SocketStreamHandle.cpp index a011482..738ea4b 100644 --- a/webkit/api/src/SocketStreamHandle.cpp +++ b/webkit/api/src/SocketStreamHandle.cpp @@ -38,13 +38,16 @@ #include "SocketStreamHandleClient.h" #include "WebData.h" #include "WebKit.h" +#include "WebKitClient.h" +#include "WebSocketStreamHandle.h" +#include "WebSocketStreamHandleClient.h" #include <wtf/PassOwnPtr.h> using namespace WebKit; namespace WebCore { -class SocketStreamHandleInternal { +class SocketStreamHandleInternal : public WebSocketStreamHandleClient { public: static PassOwnPtr<SocketStreamHandleInternal> create(SocketStreamHandle* handle) { @@ -52,16 +55,32 @@ public: } virtual ~SocketStreamHandleInternal(); - // TODO(ukai): implement this. + void connect(const KURL&); + int send(const char*, int); + void close(); + + virtual void willOpenStream(WebSocketStreamHandle*, const WebURL&); + + virtual void didOpenStream(WebSocketStreamHandle*, int); + virtual void didSendData(WebSocketStreamHandle*, int); + virtual void didReceiveData(WebSocketStreamHandle*, const WebData&); + virtual void didClose(WebSocketStreamHandle*); + virtual void didFail(WebSocketStreamHandle*, const WebSocketStreamError&); private: explicit SocketStreamHandleInternal(SocketStreamHandle*); SocketStreamHandle* m_handle; + OwnPtr<WebSocketStreamHandle> m_socket; + int m_maxPendingSendAllowed; + int m_pendingAmountSent; }; -SocketStreamHandleInternal::SocketStreamHandleInternal(SocketStreamHandle* handle) +SocketStreamHandleInternal::SocketStreamHandleInternal( + SocketStreamHandle *handle) : m_handle(handle) + , m_maxPendingSendAllowed(0) + , m_pendingAmountSent(0) { } @@ -70,13 +89,125 @@ SocketStreamHandleInternal::~SocketStreamHandleInternal() m_handle = 0; } +void SocketStreamHandleInternal::connect(const KURL& url) +{ + m_socket.set(webKitClient()->createSocketStreamHandle()); + LOG(Network, "connect"); + ASSERT(m_socket.get()); + m_socket->connect(url, this); +} + +int SocketStreamHandleInternal::send(const char* data, int len) +{ + LOG(Network, "send len=%d", len); + ASSERT(m_socket.get()); + if (m_pendingAmountSent + len >= m_maxPendingSendAllowed) + len = m_maxPendingSendAllowed - m_pendingAmountSent - 1; + + if (len <= 0) + return len; + WebData webdata(data, len); + if (m_socket->send(webdata)) { + m_pendingAmountSent += len; + LOG(Network, "sent"); + if (m_handle && m_handle->m_client) + m_handle->m_client->willSendData(m_handle, webdata.data(), webdata.size()); + return len; + } + LOG(Network, "busy. buffering"); + return 0; +} + +void SocketStreamHandleInternal::close() +{ + LOG(Network, "close"); + m_socket->close(); +} + +void SocketStreamHandleInternal::willOpenStream(WebSocketStreamHandle* socketHandle, const WebURL& url) +{ + LOG(Network, "willOpenStream"); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + if (m_handle->m_client) + m_handle->m_client->willOpenStream(m_handle, url); + } +} + +void SocketStreamHandleInternal::didOpenStream(WebSocketStreamHandle* socketHandle, int maxPendingSendAllowed) +{ + LOG(Network, "SocketStreamHandleInternal::didOpen %d", + maxPendingSendAllowed); + ASSERT(maxPendingSendAllowed > 0); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + m_maxPendingSendAllowed = maxPendingSendAllowed; + m_handle->m_state = SocketStreamHandleBase::Open; + if (m_handle->m_client) { + m_handle->m_client->didOpen(m_handle); + return; + } + } + LOG(Network, "no m_handle or m_socket?"); +} + +void SocketStreamHandleInternal::didSendData(WebSocketStreamHandle* socketHandle, int amountSent) +{ + LOG(Network, "SocketStreamHandleInternal::didSendData %d", amountSent); + ASSERT(amountSent > 0); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + m_pendingAmountSent -= amountSent; + ASSERT(m_pendingAmountSent >= 0); + m_handle->sendPendingData(); + } +} + +void SocketStreamHandleInternal::didReceiveData(WebSocketStreamHandle* socketHandle, const WebData& data) +{ + LOG(Network, "didReceiveData"); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + if (m_handle->m_client) + m_handle->m_client->didReceiveData(m_handle, data.data(), data.size()); + } +} + +void SocketStreamHandleInternal::didClose(WebSocketStreamHandle* socketHandle) +{ + LOG(Network, "didClose"); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + m_socket.clear(); + SocketStreamHandle* h = m_handle; + m_handle = NULL; + if (h->m_client) + h->m_client->didClose(h); + } +} + +void SocketStreamHandleInternal::didFail(WebSocketStreamHandle* socketHandle, const WebSocketStreamError& err) +{ + LOG(Network, "didFail"); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + m_socket.clear(); + SocketStreamHandle* h = m_handle; + m_handle = NULL; + if (h->m_client) + h->m_client->didClose(h); // didFail(h, err); + } +} + +// FIXME: auth + // SocketStreamHandle ---------------------------------------------------------- SocketStreamHandle::SocketStreamHandle(const KURL& url, SocketStreamHandleClient* client) - : SocketStreamHandleBase(url, client) + : SocketStreamHandleBase(url, client) { m_internal = SocketStreamHandleInternal::create(this); - notImplemented(); + m_internal->connect(m_url); } SocketStreamHandle::~SocketStreamHandle() @@ -87,18 +218,21 @@ SocketStreamHandle::~SocketStreamHandle() int SocketStreamHandle::platformSend(const char* buf, int len) { - notImplemented(); - return 0; + if (!m_internal.get()) + return 0; + return m_internal->send(buf, len); } void SocketStreamHandle::platformClose() { - notImplemented(); + if (m_internal.get()) + m_internal->close(); } void SocketStreamHandle::didReceiveAuthenticationChallenge(const AuthenticationChallenge& challenge) { - notImplemented(); + if (m_client) + m_client->didReceiveAuthenticationChallenge(this, challenge); } void SocketStreamHandle::receivedCredential(const AuthenticationChallenge& challenge, const Credential& credential) @@ -113,7 +247,8 @@ void SocketStreamHandle::receivedRequestToContinueWithoutCredential(const Authen void SocketStreamHandle::receivedCancellation(const AuthenticationChallenge& challenge) { - notImplemented(); + if (m_client) + m_client->receivedCancellation(this, challenge); } } // namespace WebCore |