Changeset 54267 in webkit


Ignore:
Timestamp:
Feb 2, 2010 5:36:14 PM (14 years ago)
Author:
ukai@chromium.org
Message:

2010-02-02 Fumitoshi Ukai <ukai@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@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.
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r54254 r54267  
     12010-02-02  Fumitoshi Ukai  <ukai@chromium.org>
     2
     3        Reviewed by Alexey Proskuryakov.
     4
     5        WebSocket wrapper can be collected even if events are pending
     6        https://bugs.webkit.org/show_bug.cgi?id=34014
     7
     8        * websocket/tests/websocket-pending-activity-expected.txt: Added.
     9        * websocket/tests/websocket-pending-activity.html: Added.
     10
    1112010-02-02  Eric Seidel  <eric@webkit.org>
    212
  • trunk/WebCore/ChangeLog

    r54266 r54267  
     12010-02-02  Fumitoshi Ukai  <ukai@chromium.org>
     2
     3        Reviewed by Alexey Proskuryakov.
     4
     5        WebSocket set pending activity to avoid unexpected GC.
     6        https://bugs.webkit.org/show_bug.cgi?id=34014
     7
     8        Test: websocket/tests/websocket-pending-activity.html
     9
     10        * websockets/WebSocket.cpp:
     11        (WebCore::WebSocket::connect): set pending activity until it receives didClose.
     12        (WebCore::WebSocket::contextDestroyed): check socket is already closed.
     13        (WebCore::WebSocket::stop): close the connection and unset pending activity when it stops.
     14        (WebCore::WebSocket::didClose): unset pending activity.
     15        * websockets/WebSocket.h:
     16        * websockets/WebSocketChannel.cpp:
     17        (WebCore::WebSocketChannel::didReceiveData): protect this while it processes received data.
     18
    1192010-02-02  Gustavo Noronha Silva  <gns@gnome.org>
    220
  • trunk/WebCore/websockets/WebSocket.cpp

    r52892 r54267  
    152152    m_channel = ThreadableWebSocketChannel::create(scriptExecutionContext(), this, m_url, m_protocol);
    153153    m_channel->connect();
     154    ActiveDOMObject::setPendingActivity(this);
    154155}
    155156
     
    199200}
    200201
     202void WebSocket::contextDestroyed()
     203{
     204    LOG(Network, "WebSocket %p scriptExecutionContext destroyed", this);
     205    ASSERT(!m_channel);
     206    ASSERT(m_state == CLOSED);
     207    ActiveDOMObject::contextDestroyed();
     208}
     209
     210void WebSocket::stop()
     211{
     212    bool pending = hasPendingActivity();
     213    if (m_channel)
     214        m_channel->disconnect();
     215    m_channel = 0;
     216    m_state = CLOSED;
     217    ActiveDOMObject::stop();
     218    if (pending)
     219        ActiveDOMObject::unsetPendingActivity(this);
     220}
     221
    201222void WebSocket::didConnect()
    202223{
     
    225246    m_state = CLOSED;
    226247    dispatchEvent(Event::create(eventNames().closeEvent, false, false));
     248    m_channel = 0;
     249    if (hasPendingActivity())
     250        ActiveDOMObject::unsetPendingActivity(this);
    227251}
    228252
  • trunk/WebCore/websockets/WebSocket.h

    r52892 r54267  
    8383
    8484        virtual ScriptExecutionContext* scriptExecutionContext() const;
     85        virtual void contextDestroyed();
     86        virtual void stop();
    8587
    8688        using RefCounted<WebSocket>::ref;
  • trunk/WebCore/websockets/WebSocketChannel.cpp

    r52234 r54267  
    142142{
    143143    LOG(Network, "WebSocketChannel %p didReceiveData %d", this, len);
     144    RefPtr<WebSocketChannel> protect(this); // The client can close the channel, potentially removing the last reference.
    144145    ASSERT(handle == m_handle);
    145146    if (!appendToBuffer(data, len)) {
Note: See TracChangeset for help on using the changeset viewer.