Changeset 61375 in webkit


Ignore:
Timestamp:
Jun 17, 2010 9:30:17 PM (14 years ago)
Author:
ukai@chromium.org
Message:

2010-06-17 Fumitoshi Ukai <ukai@chromium.org>

Reviewed by Alexey Proskuryakov.

WebSocket: resume should not process buffer if already processing.
https://bugs.webkit.org/show_bug.cgi?id=39340

Reviewed by Alexey Proskuryakov.

  • websocket/tests/alert-in-event-handler-expected.txt: Added.
  • websocket/tests/alert-in-event-handler.html: Added.
  • websocket/tests/script-tests/alert-in-event-handler.js: Added.
  • websocket/tests/send2_wsh.py: Added.

2010-06-17 Fumitoshi Ukai <ukai@chromium.org>

Reviewed by Alexey Proskuryakov.

WebSocket: resume should not process buffer if already processing.
https://bugs.webkit.org/show_bug.cgi?id=39340

Test: websocket/tests/alert-in-event-handler.html

While running an event handler of WebSocket object, it may be suspended
and resumed in various reason. e.g. alert() will suspend/resume
ActiveDOM objects. In chromium, sending IPC message would also
suspend/resume ActiveDOM objects.
If resume process pending buffer in this case, another event might
be fired while running the initial event handler.
Thus, resume should not process pending buffer immediately.
Pending buffer would be processed after the current task has been
finished.

  • websockets/ThreadableWebSocketChannelClientWrapper.h:
  • websockets/WebSocketChannel.cpp: (WebCore::WebSocketChannel::WebSocketChannel): (WebCore::WebSocketChannel::resume): Just set one shot timer for resumeTimerFired() if not yet set. (WebCore::WebSocketChannel::resumeTimerFired): Process pending event after resume was called.
  • websockets/WebSocketChannel.h:
Location:
trunk
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r61373 r61375  
     12010-06-17  Fumitoshi Ukai  <ukai@chromium.org>
     2
     3        Reviewed by Alexey Proskuryakov.
     4
     5        WebSocket: resume should not process buffer if already processing.
     6        https://bugs.webkit.org/show_bug.cgi?id=39340
     7
     8        Reviewed by Alexey Proskuryakov.
     9
     10        * websocket/tests/alert-in-event-handler-expected.txt: Added.
     11        * websocket/tests/alert-in-event-handler.html: Added.
     12        * websocket/tests/script-tests/alert-in-event-handler.js: Added.
     13        * websocket/tests/send2_wsh.py: Added.
     14
    1152010-06-17  Kent Tamura  <tkent@chromium.org>
    216
  • trunk/WebCore/ChangeLog

    r61374 r61375  
     12010-06-17  Fumitoshi Ukai  <ukai@chromium.org>
     2
     3        Reviewed by Alexey Proskuryakov.
     4
     5        WebSocket: resume should not process buffer if already processing.
     6        https://bugs.webkit.org/show_bug.cgi?id=39340
     7
     8        Test: websocket/tests/alert-in-event-handler.html
     9
     10        While running an event handler of WebSocket object, it may be suspended
     11        and resumed in various reason. e.g. alert() will suspend/resume
     12        ActiveDOM objects. In chromium, sending IPC message would also
     13        suspend/resume ActiveDOM objects.
     14        If resume process pending buffer in this case, another event might
     15        be fired while running the initial event handler.
     16        Thus, resume should not process pending buffer immediately.
     17        Pending buffer would be processed after the current task has been
     18        finished.
     19
     20        * websockets/ThreadableWebSocketChannelClientWrapper.h:
     21        * websockets/WebSocketChannel.cpp:
     22        (WebCore::WebSocketChannel::WebSocketChannel):
     23        (WebCore::WebSocketChannel::resume):
     24         Just set one shot timer for resumeTimerFired() if not yet set.
     25        (WebCore::WebSocketChannel::resumeTimerFired):
     26         Process pending event after resume was called.
     27        * websockets/WebSocketChannel.h:
     28
    1292010-06-17  Eric Seidel  <eric@webkit.org>
    230
  • trunk/WebCore/websockets/ThreadableWebSocketChannelClientWrapper.h

    r59116 r61375  
    3535
    3636#include "PlatformString.h"
     37#include "Timer.h"
    3738#include "WebSocketChannelClient.h"
    3839#include <wtf/PassRefPtr.h>
     
    120121    {
    121122        m_suspended = false;
    122         processPendingEvents();
     123        if ((m_pendingConnected || !m_pendingMessages.isEmpty() || m_pendingClosed) && !m_resumeTimer.isActive())
     124            m_resumeTimer.startOneShot(0);
    123125    }
    124126
     
    132134        , m_pendingConnected(false)
    133135        , m_pendingClosed(false)
     136        , m_resumeTimer(this, &ThreadableWebSocketChannelClientWrapper::resumeTimerFired)
    134137    {
    135138    }
     
    158161    }
    159162
     163    void resumeTimerFired(Timer<ThreadableWebSocketChannelClientWrapper>* timer)
     164    {
     165        ASSERT_UNUSED(timer, timer == &m_resumeTimer);
     166        processPendingEvents();
     167    }
     168
    160169    WebSocketChannelClient* m_client;
    161170    bool m_syncMethodDone;
     
    166175    Vector<String> m_pendingMessages;
    167176    bool m_pendingClosed;
     177    Timer<ThreadableWebSocketChannelClientWrapper> m_resumeTimer;
    168178};
    169179
  • trunk/WebCore/websockets/WebSocketChannel.cpp

    r59116 r61375  
    5959    , m_buffer(0)
    6060    , m_bufferSize(0)
     61    , m_resumeTimer(this, &WebSocketChannel::resumeTimerFired)
    6162    , m_suspended(false)
    6263    , m_closed(false)
     
    126127{
    127128    m_suspended = false;
    128     RefPtr<WebSocketChannel> protect(this); // The client can close the channel, potentially removing the last reference.
    129     while (!m_suspended && m_client && m_buffer)
    130         if (!processBuffer())
    131             break;
    132     if (!m_suspended && m_client && m_closed && m_handle)
    133         didClose(m_handle.get());
     129    if ((m_buffer || m_closed) && m_client && !m_resumeTimer.isActive())
     130        m_resumeTimer.startOneShot(0);
    134131}
    135132
     
    235232    ASSERT(m_client);
    236233    ASSERT(m_buffer);
     234
    237235    if (m_handshake.mode() == WebSocketHandshake::Incomplete) {
    238236        int headerLength = m_handshake.readServerHandshake(m_buffer, m_bufferSize);
     
    319317}
    320318
     319void WebSocketChannel::resumeTimerFired(Timer<WebSocketChannel>* timer)
     320{
     321    ASSERT_UNUSED(timer, timer == &m_resumeTimer);
     322
     323    RefPtr<WebSocketChannel> protect(this); // The client can close the channel, potentially removing the last reference.
     324    while (!m_suspended && m_client && m_buffer)
     325        if (!processBuffer())
     326            break;
     327    if (!m_suspended && m_client && m_closed && m_handle)
     328        didClose(m_handle.get());
     329}
     330
    321331}  // namespace WebCore
    322332
  • trunk/WebCore/websockets/WebSocketChannel.h

    r59116 r61375  
    8383        void skipBuffer(int len);
    8484        bool processBuffer();
     85        void resumeTimerFired(Timer<WebSocketChannel>* timer);
    8586
    8687        ScriptExecutionContext* m_context;
     
    9192        int m_bufferSize;
    9293
     94        Timer<WebSocketChannel> m_resumeTimer;
    9395        bool m_suspended;
    9496        bool m_closed;
Note: See TracChangeset for help on using the changeset viewer.