[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