[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.19-706-ge5415e9
ukai at chromium.org
ukai at chromium.org
Thu Feb 4 21:37:29 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 5b97edf69d8bfa0cf1f31172e1aa22ad52253e80
Author: ukai at chromium.org <ukai at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Wed Feb 3 01:36:14 2010 +0000
2010-02-02 Fumitoshi Ukai <ukai at chromium.org>
Reviewed by Alexey Proskuryakov.
WebSocket wrapper can be collected even if events are pending
https://bugs.webkit.org/show_bug.cgi?id=34014
* websocket/tests/websocket-pending-activity-expected.txt: Added.
* websocket/tests/websocket-pending-activity.html: Added.
2010-02-02 Fumitoshi Ukai <ukai at chromium.org>
Reviewed by Alexey Proskuryakov.
WebSocket set pending activity to avoid unexpected GC.
https://bugs.webkit.org/show_bug.cgi?id=34014
Test: websocket/tests/websocket-pending-activity.html
* websockets/WebSocket.cpp:
(WebCore::WebSocket::connect): set pending activity until it receives didClose.
(WebCore::WebSocket::contextDestroyed): check socket is already closed.
(WebCore::WebSocket::stop): close the connection and unset pending activity when it stops.
(WebCore::WebSocket::didClose): unset pending activity.
* websockets/WebSocket.h:
* websockets/WebSocketChannel.cpp:
(WebCore::WebSocketChannel::didReceiveData): protect this while it processes received data.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54267 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 6b5ab6f..e10a801 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,13 @@
+2010-02-02 Fumitoshi Ukai <ukai at chromium.org>
+
+ Reviewed by Alexey Proskuryakov.
+
+ WebSocket wrapper can be collected even if events are pending
+ https://bugs.webkit.org/show_bug.cgi?id=34014
+
+ * websocket/tests/websocket-pending-activity-expected.txt: Added.
+ * websocket/tests/websocket-pending-activity.html: Added.
+
2010-02-02 Eric Seidel <eric at webkit.org>
Reviewed by Gustavo Noronha Silva.
diff --git a/LayoutTests/websocket/tests/websocket-pending-activity-expected.txt b/LayoutTests/websocket/tests/websocket-pending-activity-expected.txt
new file mode 100644
index 0000000..7340bc0
--- /dev/null
+++ b/LayoutTests/websocket/tests/websocket-pending-activity-expected.txt
@@ -0,0 +1,2 @@
+ALERT: PASS
+Should alert "PASS".
diff --git a/LayoutTests/websocket/tests/websocket-pending-activity.html b/LayoutTests/websocket/tests/websocket-pending-activity.html
new file mode 100644
index 0000000..1fcb6b3
--- /dev/null
+++ b/LayoutTests/websocket/tests/websocket-pending-activity.html
@@ -0,0 +1,34 @@
+<body onload="test()">
+<p>Should alert "PASS".</p>
+<script>
+if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.waitUntilDone();
+}
+
+function gc()
+{
+ if (window.GCController)
+ return GCController.collect();
+
+ for (var i = 0; i < 10000; i++) { // > force garbage collection (FF requires about 9K allocations before a collect)
+ var s = new String("abc");
+ }
+}
+
+function test()
+{
+ var ws = new WebSocket("ws://127.0.0.1:8880/websocket/tests/echo");
+ ws.onopen = function() {
+ this.send("PASS");
+ }
+ ws.onmessage = function(msg) {
+ alert(msg.data);
+ if (window.layoutTestController)
+ layoutTestController.notifyDone();
+ }
+ ws = null;
+ gc();
+}
+</script>
+
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index bafcc95..691bd1c 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,21 @@
+2010-02-02 Fumitoshi Ukai <ukai at chromium.org>
+
+ Reviewed by Alexey Proskuryakov.
+
+ WebSocket set pending activity to avoid unexpected GC.
+ https://bugs.webkit.org/show_bug.cgi?id=34014
+
+ Test: websocket/tests/websocket-pending-activity.html
+
+ * websockets/WebSocket.cpp:
+ (WebCore::WebSocket::connect): set pending activity until it receives didClose.
+ (WebCore::WebSocket::contextDestroyed): check socket is already closed.
+ (WebCore::WebSocket::stop): close the connection and unset pending activity when it stops.
+ (WebCore::WebSocket::didClose): unset pending activity.
+ * websockets/WebSocket.h:
+ * websockets/WebSocketChannel.cpp:
+ (WebCore::WebSocketChannel::didReceiveData): protect this while it processes received data.
+
2010-02-02 Gustavo Noronha Silva <gns at gnome.org>
No review, rolling out r54261.
diff --git a/WebCore/websockets/WebSocket.cpp b/WebCore/websockets/WebSocket.cpp
index 0435490..f50dc5c 100644
--- a/WebCore/websockets/WebSocket.cpp
+++ b/WebCore/websockets/WebSocket.cpp
@@ -151,6 +151,7 @@ void WebSocket::connect(const KURL& url, const String& protocol, ExceptionCode&
m_channel = ThreadableWebSocketChannel::create(scriptExecutionContext(), this, m_url, m_protocol);
m_channel->connect();
+ ActiveDOMObject::setPendingActivity(this);
}
bool WebSocket::send(const String& message, ExceptionCode& ec)
@@ -198,6 +199,26 @@ ScriptExecutionContext* WebSocket::scriptExecutionContext() const
return ActiveDOMObject::scriptExecutionContext();
}
+void WebSocket::contextDestroyed()
+{
+ LOG(Network, "WebSocket %p scriptExecutionContext destroyed", this);
+ ASSERT(!m_channel);
+ ASSERT(m_state == CLOSED);
+ ActiveDOMObject::contextDestroyed();
+}
+
+void WebSocket::stop()
+{
+ bool pending = hasPendingActivity();
+ if (m_channel)
+ m_channel->disconnect();
+ m_channel = 0;
+ m_state = CLOSED;
+ ActiveDOMObject::stop();
+ if (pending)
+ ActiveDOMObject::unsetPendingActivity(this);
+}
+
void WebSocket::didConnect()
{
LOG(Network, "WebSocket %p didConnect", this);
@@ -224,6 +245,9 @@ void WebSocket::didClose()
LOG(Network, "WebSocket %p didClose", this);
m_state = CLOSED;
dispatchEvent(Event::create(eventNames().closeEvent, false, false));
+ m_channel = 0;
+ if (hasPendingActivity())
+ ActiveDOMObject::unsetPendingActivity(this);
}
EventTargetData* WebSocket::eventTargetData()
diff --git a/WebCore/websockets/WebSocket.h b/WebCore/websockets/WebSocket.h
index 18e2b25..c72dbbd 100644
--- a/WebCore/websockets/WebSocket.h
+++ b/WebCore/websockets/WebSocket.h
@@ -82,6 +82,8 @@ namespace WebCore {
virtual WebSocket* toWebSocket() { return this; }
virtual ScriptExecutionContext* scriptExecutionContext() const;
+ virtual void contextDestroyed();
+ virtual void stop();
using RefCounted<WebSocket>::ref;
using RefCounted<WebSocket>::deref;
diff --git a/WebCore/websockets/WebSocketChannel.cpp b/WebCore/websockets/WebSocketChannel.cpp
index 5c0f4c3..df66c14 100644
--- a/WebCore/websockets/WebSocketChannel.cpp
+++ b/WebCore/websockets/WebSocketChannel.cpp
@@ -141,6 +141,7 @@ void WebSocketChannel::didClose(SocketStreamHandle* handle)
void WebSocketChannel::didReceiveData(SocketStreamHandle* handle, const char* data, int len)
{
LOG(Network, "WebSocketChannel %p didReceiveData %d", this, len);
+ RefPtr<WebSocketChannel> protect(this); // The client can close the channel, potentially removing the last reference.
ASSERT(handle == m_handle);
if (!appendToBuffer(data, len)) {
handle->close();
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list