summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk2
-rw-r--r--Source/WebCore/Android.derived.v8bindings.mk4
-rw-r--r--Source/WebCore/Android.mk12
-rw-r--r--Source/WebCore/platform/network/android/SocketStreamError.h47
-rw-r--r--Source/WebCore/platform/network/android/SocketStreamHandle.h79
-rw-r--r--Source/WebCore/platform/network/android/SocketStreamHandleAndroid.cpp126
-rw-r--r--Source/WebKit/Android.mk3
-rw-r--r--Source/WebKit/android/WebCoreSupport/WebSocketBridge.cpp192
-rw-r--r--Source/WebKit/android/WebCoreSupport/WebSocketBridge.h61
-rw-r--r--Source/WebKit/android/jni/WebCoreJniOnLoad.cpp7
-rw-r--r--Source/WebKit/android/jni/WebSettings.cpp11
11 files changed, 542 insertions, 2 deletions
diff --git a/Android.mk b/Android.mk
index 8faa76b..221f4dc 100644
--- a/Android.mk
+++ b/Android.mk
@@ -310,6 +310,8 @@ ifeq ($(call is-board-platform-in-list,$(KRAIT_BOARD_PLATFORM_LIST)),true)
LOCAL_CFLAGS += -DENABLE_PLD_DOM_TRAVERSAL
endif
+LOCAL_CFLAGS += -DENABLE_WEB_SOCKETS=1
+
# LOCAL_LDLIBS is used in simulator builds only and simulator builds are only
# valid on Linux
LOCAL_LDLIBS += -lpthread -ldl
diff --git a/Source/WebCore/Android.derived.v8bindings.mk b/Source/WebCore/Android.derived.v8bindings.mk
index ec04e1a..173941b 100644
--- a/Source/WebCore/Android.derived.v8bindings.mk
+++ b/Source/WebCore/Android.derived.v8bindings.mk
@@ -34,6 +34,10 @@ js_binding_scripts := \
# Add ACCELERATED_COMPOSITING=1 and ENABLE_3D_RENDERING=1 for layers support
FEATURE_DEFINES := ENABLE_ORIENTATION_EVENTS=1 ENABLE_TOUCH_EVENTS=1 ENABLE_DATABASE=1 ENABLE_OFFLINE_WEB_APPLICATIONS=1 ENABLE_DOM_STORAGE=1 ENABLE_VIDEO=1 ENABLE_GEOLOCATION=1 ENABLE_CONNECTION=1 ENABLE_APPLICATION_INSTALLED=1 ENABLE_XPATH=1 ENABLE_XSLT=1 ENABLE_DEVICE_ORIENTATION=1 ENABLE_FILE_READER=1 ENABLE_BLOB=1 ENABLE_WEB_TIMING=1 ENABLE_MEDIA_CAPTURE=1
+
+# Add HTML5 WebSockets support
+FEATURE_DEFINES += ENABLE_WEB_SOCKETS=1
+
# The defines above should be identical to those for JSC.
FEATURE_DEFINES += V8_BINDING
diff --git a/Source/WebCore/Android.mk b/Source/WebCore/Android.mk
index 1f8868e..164499e 100644
--- a/Source/WebCore/Android.mk
+++ b/Source/WebCore/Android.mk
@@ -1095,6 +1095,18 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
storage/StorageSyncManager.cpp \
storage/StorageTracker.cpp
+LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
+ websockets/WebSocket.cpp \
+ websockets/WebSocketChannel.cpp \
+ websockets/WebSocketHandshake.cpp \
+ websockets/ThreadableWebSocketChannel.cpp \
+ websockets/WorkerThreadableWebSocketChannel.cpp \
+ websockets/WebSocketHandshakeRequest.cpp \
+ websockets/WebSocketHandshakeResponse.cpp \
+ platform/network/SocketStreamHandleBase.cpp \
+ platform/network/SocketStreamErrorBase.cpp \
+ platform/network/android/SocketStreamHandleAndroid.cpp
+
ifeq ($(ENABLE_SVG), true)
LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
svg/ColorDistance.cpp \
diff --git a/Source/WebCore/platform/network/android/SocketStreamError.h b/Source/WebCore/platform/network/android/SocketStreamError.h
new file mode 100644
index 0000000..540496b
--- /dev/null
+++ b/Source/WebCore/platform/network/android/SocketStreamError.h
@@ -0,0 +1,47 @@
+/*
+ * 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 SocketStreamError_h
+#define SocketStreamError_h
+
+#include "SocketStreamErrorBase.h"
+
+namespace WebCore {
+
+class SocketStreamError : public SocketStreamErrorBase {
+public:
+ SocketStreamError() { }
+ explicit SocketStreamError(int errorCode)
+ : SocketStreamErrorBase(errorCode) { }
+};
+
+} // namespace WebCore
+
+#endif // SocketStreamError_h
diff --git a/Source/WebCore/platform/network/android/SocketStreamHandle.h b/Source/WebCore/platform/network/android/SocketStreamHandle.h
new file mode 100644
index 0000000..4f1c611
--- /dev/null
+++ b/Source/WebCore/platform/network/android/SocketStreamHandle.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * 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 SocketStreamHandle_h
+#define SocketStreamHandle_h
+
+#include "SocketStreamHandleBase.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+
+namespace WebCore {
+
+class AuthenticationChallenge;
+class Credential;
+class ScriptExecutionContext;
+class SocketStreamHandleClient;
+class ResourceResponse;
+class WebSocketBridge;
+
+class SocketStreamHandle : public RefCounted<SocketStreamHandle>, public SocketStreamHandleBase {
+public:
+ static PassRefPtr<SocketStreamHandle> create(const KURL& url, SocketStreamHandleClient* client)
+ {
+ return adoptRef(new SocketStreamHandle(url, client));
+ }
+ virtual ~SocketStreamHandle();
+
+ void socketConnectedCallback();
+ void socketClosedCallback();
+ void socketReadyReadCallback(const char*, int);
+ void socketErrorCallback();
+
+protected:
+ virtual int platformSend(const char* data, int length);
+ virtual void platformClose();
+
+private:
+ SocketStreamHandle(const KURL&, SocketStreamHandleClient*);
+
+ // No authentication for streams per se, but proxy may ask for credentials.
+ void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
+ void receivedCredential(const AuthenticationChallenge&, const Credential&);
+ void receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&);
+ void receivedCancellation(const AuthenticationChallenge&);
+
+ KURL m_url;
+ OwnPtr<WebSocketBridge> m_webSocketBridge;
+};
+} // namespace WebCore
+
+#endif // SocketStreamHandle_h
diff --git a/Source/WebCore/platform/network/android/SocketStreamHandleAndroid.cpp b/Source/WebCore/platform/network/android/SocketStreamHandleAndroid.cpp
new file mode 100644
index 0000000..e5ee6ec
--- /dev/null
+++ b/Source/WebCore/platform/network/android/SocketStreamHandleAndroid.cpp
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2013 Google Inc. All rights reserved.
+ * Copyright (C) 2013 Oleg Smirnov
+ *
+ * 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.
+ */
+
+#include "config.h"
+
+#include "Logging.h"
+#include "NotImplemented.h"
+#include "SocketStreamHandle.h"
+#include "SocketStreamHandleClient.h"
+#include "WebSocketBridge.h"
+
+namespace WebCore {
+
+SocketStreamHandle::SocketStreamHandle(const KURL& url, SocketStreamHandleClient* client)
+ : SocketStreamHandleBase(url, client)
+ , m_url(url)
+{
+ LOG(Network, "SocketStreamHandle::SocketStreamHandle %p", this);
+ bool isSecure = m_url.protocolIs("wss");
+ int port = m_url.hasPort() ? m_url.port() : (isSecure ? 443 : 80);
+
+ String httpProtocol = isSecure ? "https://" : "http://";
+ String uri = httpProtocol + m_url.host() + ":" + String::number(port);
+
+ m_webSocketBridge = adoptPtr(new WebSocketBridge(this, uri));
+}
+
+SocketStreamHandle::~SocketStreamHandle()
+{
+ LOG(Network, "SocketStreamHandle::~SocketStreamHandle %p", this);
+}
+
+void SocketStreamHandle::socketConnectedCallback()
+{
+ LOG(Network, "SocketStreamHandle::socketConnected %p", this);
+ // The client can close the handle, potentially removing the last reference.
+ RefPtr<SocketStreamHandle> protect(this);
+ if (client()) {
+ m_state = SocketStreamHandleBase::Open;
+ client()->didOpen(this);
+ }
+}
+
+void SocketStreamHandle::socketClosedCallback()
+{
+ LOG(Network, "SocketStreamHandle::socketClosedCallback %p", this);
+ if (client()) {
+ m_state = SocketStreamHandleBase::Closed;
+ client()->didClose(this);
+ }
+}
+
+void SocketStreamHandle::socketReadyReadCallback(const char* data, int length)
+{
+ LOG(Network, "SocketStreamHandle::socketReadyRead %p", this);
+ if (client())
+ client()->didReceiveData(this, data, length);
+}
+
+void SocketStreamHandle::socketErrorCallback()
+{
+ LOG(Network, "SocketStreamHandle::socketErrorCallback %p", this);
+ if (client())
+ client()->didClose(this);
+}
+
+int SocketStreamHandle::platformSend(const char* data, int len)
+{
+ LOG(Network, "SocketStreamHandle::platformSend %p", this);
+ return m_webSocketBridge->send(data, len);
+}
+
+void SocketStreamHandle::platformClose()
+{
+ LOG(Network, "SocketStreamHandle %p platformClose", this);
+ m_webSocketBridge->close();
+}
+
+void SocketStreamHandle::didReceiveAuthenticationChallenge(const AuthenticationChallenge&)
+{
+ notImplemented();
+}
+
+void SocketStreamHandle::receivedCredential(const AuthenticationChallenge&, const Credential&)
+{
+ notImplemented();
+}
+
+void SocketStreamHandle::receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&)
+{
+ notImplemented();
+}
+
+void SocketStreamHandle::receivedCancellation(const AuthenticationChallenge&)
+{
+ notImplemented();
+}
+} // namespace WebCore
diff --git a/Source/WebKit/Android.mk b/Source/WebKit/Android.mk
index 07634b6..a28967b 100644
--- a/Source/WebKit/Android.mk
+++ b/Source/WebKit/Android.mk
@@ -44,7 +44,8 @@ LOCAL_SRC_FILES := \
android/WebCoreSupport/WebRequestContext.cpp \
android/WebCoreSupport/WebResourceRequest.cpp \
android/WebCoreSupport/WebResponse.cpp \
- android/WebCoreSupport/WebViewClientError.cpp
+ android/WebCoreSupport/WebViewClientError.cpp \
+ android/WebCoreSupport/WebSocketBridge.cpp
LOCAL_SRC_FILES += \
android/RenderSkinAndroid.cpp \
diff --git a/Source/WebKit/android/WebCoreSupport/WebSocketBridge.cpp b/Source/WebKit/android/WebCoreSupport/WebSocketBridge.cpp
new file mode 100644
index 0000000..e4d4da2
--- /dev/null
+++ b/Source/WebKit/android/WebCoreSupport/WebSocketBridge.cpp
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2013, The Android Open Source Project
+ * Copyright 2013 Oleg Smirnov
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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.
+ */
+
+#include "config.h"
+
+#if ENABLE(WEB_SOCKETS)
+
+#include "Logging.h"
+#include "WebSocketBridge.h"
+#include "WebCoreJni.h"
+#include <JNIHelp.h>
+#include <JNIUtility.h>
+
+using namespace android;
+
+static const char* javaWebSocketClass = "android/webkit/HTML5WebSocket";
+
+namespace WebCore {
+
+struct WebSocketBridge::JavaGlue
+{
+ jobject m_javaProxy;
+ jmethodID m_getInstance;
+ jmethodID m_send;
+ jmethodID m_close;
+};
+
+WebSocketBridge::WebSocketBridge(SocketStreamHandle* client, const String& uri)
+ : m_streamHandle(client)
+{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ if (!env)
+ return;
+
+ jclass clazz = env->FindClass(javaWebSocketClass);
+ if (!clazz)
+ return;
+
+ m_glue = new JavaGlue;
+ m_glue->m_getInstance = env->GetStaticMethodID(clazz, "getInstance", "(ILjava/lang/String;)Landroid/webkit/HTML5WebSocket;");
+ m_glue->m_send = env->GetMethodID(clazz, "send", "([B)V");
+ m_glue->m_close = env->GetMethodID(clazz, "close", "()V");
+
+ jstring jUrl = env->NewString((unsigned short *)uri.characters(), uri.length());
+ jobject obj = env->CallStaticObjectMethod(clazz, m_glue->m_getInstance, this, jUrl);
+ m_glue->m_javaProxy = env->NewGlobalRef(obj);
+
+ // Clean up
+ env->DeleteLocalRef(obj);
+ env->DeleteLocalRef(clazz);
+ env->DeleteLocalRef(jUrl);
+ checkException(env);
+}
+
+WebSocketBridge::~WebSocketBridge()
+{
+ if (m_glue->m_javaProxy) {
+ if (JNIEnv* env = JSC::Bindings::getJNIEnv())
+ env->DeleteGlobalRef(m_glue->m_javaProxy);
+ }
+}
+
+int WebSocketBridge::send(const char* data, int length)
+{
+ if (!data || length <= 0)
+ return length;
+
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ if (!env || !m_glue->m_javaProxy || !m_glue->m_send)
+ return 0;
+
+ jbyteArray jByteArray = env->NewByteArray(length);
+ if (!jByteArray)
+ return 0;
+
+ env->SetByteArrayRegion(jByteArray, 0, length, reinterpret_cast<const jbyte*>(data));
+ env->CallVoidMethod(m_glue->m_javaProxy, m_glue->m_send, jByteArray);
+ env->DeleteLocalRef(jByteArray);
+ checkException(env);
+ return length;
+}
+
+void WebSocketBridge::close()
+{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ if (!env || !m_glue->m_javaProxy || !m_glue->m_close)
+ return;
+
+ env->CallVoidMethod(m_glue->m_javaProxy, m_glue->m_close);
+ checkException(env);
+}
+
+void WebSocketBridge::didWebSocketConnected()
+{
+ m_streamHandle->socketConnectedCallback();
+}
+
+void WebSocketBridge::didWebSocketClosed()
+{
+ m_streamHandle->socketClosedCallback();
+}
+
+void WebSocketBridge::didWebSocketMessage(const char* data, int length)
+{
+ m_streamHandle->socketReadyReadCallback(data, length);
+}
+
+void WebSocketBridge::didWebSocketError()
+{
+ m_streamHandle->socketErrorCallback();
+}
+
+} // namespace WebCore
+
+namespace android {
+
+static void OnWebSocketConnected(JNIEnv* env, jobject obj, int pointer) {
+ if (pointer) {
+ WebCore::WebSocketBridge* bridge = reinterpret_cast<WebCore::WebSocketBridge*>(pointer);
+ bridge->didWebSocketConnected();
+ }
+}
+
+static void OnWebSocketClosed(JNIEnv* env, jobject obj, int pointer) {
+ if (pointer) {
+ WebCore::WebSocketBridge* bridge = reinterpret_cast<WebCore::WebSocketBridge*>(pointer);
+ bridge->didWebSocketClosed();
+ }
+}
+
+static void OnWebSocketMessage(JNIEnv* env, jobject obj, int pointer, jbyteArray dataArray, int length) {
+ if (pointer) {
+ WebCore::WebSocketBridge* bridge = reinterpret_cast<WebCore::WebSocketBridge*>(pointer);
+ if (jbyte* data = env->GetByteArrayElements(dataArray, NULL)) {
+ bridge->didWebSocketMessage(reinterpret_cast<const char*>(data), length);
+ env->ReleaseByteArrayElements(dataArray, data, JNI_ABORT);
+ }
+ }
+}
+
+static void OnWebSocketError(JNIEnv* env, jobject obj, int pointer) {
+ if (pointer) {
+ WebCore::WebSocketBridge* bridge = reinterpret_cast<WebCore::WebSocketBridge*>(pointer);
+ bridge->didWebSocketError();
+ }
+}
+
+/*
+ * JNI registration
+ */
+static JNINativeMethod g_WebSocketMethods[] = {
+ { "nativeOnWebSocketConnected", "(I)V", (void*) OnWebSocketConnected },
+ { "nativeOnWebSocketClosed", "(I)V", (void*) OnWebSocketClosed },
+ { "nativeOnWebSocketMessage", "(I[BI)V", (void*) OnWebSocketMessage },
+ { "nativeOnWebSocketError", "(I)V", (void*) OnWebSocketError }
+};
+
+int registerWebSockets(JNIEnv* env)
+{
+#ifndef NDEBUG
+ jclass webSocket = env->FindClass(javaWebSocketClass);
+ ALOG_ASSERT(webSocket, "Unable to find class");
+ env->DeleteLocalRef(webSocket);
+#endif
+ return jniRegisterNativeMethods(env, javaWebSocketClass, g_WebSocketMethods, NELEM(g_WebSocketMethods));
+}
+
+} // namespace android
+#endif // ENABLE(WEB_SOCKETS) \ No newline at end of file
diff --git a/Source/WebKit/android/WebCoreSupport/WebSocketBridge.h b/Source/WebKit/android/WebCoreSupport/WebSocketBridge.h
new file mode 100644
index 0000000..1baa436
--- /dev/null
+++ b/Source/WebKit/android/WebCoreSupport/WebSocketBridge.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2013, The Android Open Source Project
+ * Copyright 2013 Oleg Smirnov
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 WebSocketBridge_h
+#define WebSocketBridge_h
+
+#if ENABLE(WEB_SOCKETS)
+
+#include "SocketStreamHandle.h"
+#include <wtf/OwnPtr.h>
+#include <jni.h>
+
+namespace WebCore {
+
+class WebSocketBridge
+{
+public:
+ WebSocketBridge(SocketStreamHandle*, const String&);
+ ~WebSocketBridge();
+
+ int send(const char*, int);
+ void close();
+
+ void didWebSocketConnected();
+ void didWebSocketClosed();
+ void didWebSocketMessage(const char*, int);
+ void didWebSocketError();
+
+private:
+ struct JavaGlue;
+ OwnPtr<JavaGlue> m_glue;
+
+ SocketStreamHandle* m_streamHandle;
+};
+} // namespace WebCore
+
+#endif // ENABLE(WEB_SOCKETS)
+#endif // WebSocketBridge_h
diff --git a/Source/WebKit/android/jni/WebCoreJniOnLoad.cpp b/Source/WebKit/android/jni/WebCoreJniOnLoad.cpp
index ec052f1..a62e55d 100644
--- a/Source/WebKit/android/jni/WebCoreJniOnLoad.cpp
+++ b/Source/WebKit/android/jni/WebCoreJniOnLoad.cpp
@@ -83,6 +83,9 @@ extern int registerViewStateSerializer(JNIEnv*);
#if ENABLE(DATABASE)
extern int registerWebStorage(JNIEnv*);
#endif
+#if ENABLE(WEB_SOCKETS)
+extern int registerWebSockets(JNIEnv*);
+#endif
extern int registerGeolocationPermissions(JNIEnv*);
extern int registerMockGeolocation(JNIEnv*);
#if ENABLE(VIDEO)
@@ -92,7 +95,6 @@ extern int registerMediaPlayerVideo(JNIEnv*);
extern int registerDeviceMotionAndOrientationManager(JNIEnv*);
extern int registerCookieManager(JNIEnv*);
extern int registerCacheManager(JNIEnv*);
-
}
struct RegistrationMethod {
@@ -110,6 +112,9 @@ static RegistrationMethod gWebCoreRegMethods[] = {
#if ENABLE(DATABASE)
{ "WebStorage", android::registerWebStorage },
#endif
+#if ENABLE(WEB_SOCKETS)
+ { "WebSockets", android::registerWebSockets },
+#endif
{ "WebView", android::registerWebView },
{ "ViewStateSerializer", android::registerViewStateSerializer },
{ "GeolocationPermissions", android::registerGeolocationPermissions },
diff --git a/Source/WebKit/android/jni/WebSettings.cpp b/Source/WebKit/android/jni/WebSettings.cpp
index 6aff63e..4290ca3 100644
--- a/Source/WebKit/android/jni/WebSettings.cpp
+++ b/Source/WebKit/android/jni/WebSettings.cpp
@@ -53,6 +53,7 @@
#include "WebCoreJni.h"
#include "WorkerContextExecutionProxy.h"
#include "WebRequestContext.h"
+#include "WebSocket.h"
#include "WebViewCore.h"
#include <JNIHelp.h>
@@ -102,6 +103,9 @@ struct FieldIds {
#if ENABLE(DATABASE)
mDatabaseEnabled = env->GetFieldID(clazz, "mDatabaseEnabled", "Z");
#endif
+#if ENABLE(WEB_SOCKETS)
+ mWebSocketsEnabled = env->GetFieldID(clazz, "mWebSocketsEnabled", "Z");
+#endif
#if ENABLE(DOM_STORAGE)
mDomStorageEnabled = env->GetFieldID(clazz, "mDomStorageEnabled", "Z");
#endif
@@ -265,6 +269,9 @@ struct FieldIds {
#if ENABLE(DATABASE)
jfieldID mDatabaseEnabled;
#endif
+#if ENABLE(WEB_SOCKETS)
+ jfieldID mWebSocketsEnabled;
+#endif
#if ENABLE(DOM_STORAGE)
jfieldID mDomStorageEnabled;
#endif
@@ -546,6 +553,10 @@ public:
}
}
#endif
+#if ENABLE(WEB_SOCKETS)
+ flag = env->GetBooleanField(obj, gFieldIds->mWebSocketsEnabled);
+ WebCore::WebSocket::setIsAvailable(flag);
+#endif
#if ENABLE(DOM_STORAGE)
flag = env->GetBooleanField(obj, gFieldIds->mDomStorageEnabled);
s->setLocalStorageEnabled(flag);