Changeset 61375 in webkit
- Timestamp:
- Jun 17, 2010 9:30:17 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r61373 r61375 1 2010-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 1 15 2010-06-17 Kent Tamura <tkent@chromium.org> 2 16 -
trunk/WebCore/ChangeLog
r61374 r61375 1 2010-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 1 29 2010-06-17 Eric Seidel <eric@webkit.org> 2 30 -
trunk/WebCore/websockets/ThreadableWebSocketChannelClientWrapper.h
r59116 r61375 35 35 36 36 #include "PlatformString.h" 37 #include "Timer.h" 37 38 #include "WebSocketChannelClient.h" 38 39 #include <wtf/PassRefPtr.h> … … 120 121 { 121 122 m_suspended = false; 122 processPendingEvents(); 123 if ((m_pendingConnected || !m_pendingMessages.isEmpty() || m_pendingClosed) && !m_resumeTimer.isActive()) 124 m_resumeTimer.startOneShot(0); 123 125 } 124 126 … … 132 134 , m_pendingConnected(false) 133 135 , m_pendingClosed(false) 136 , m_resumeTimer(this, &ThreadableWebSocketChannelClientWrapper::resumeTimerFired) 134 137 { 135 138 } … … 158 161 } 159 162 163 void resumeTimerFired(Timer<ThreadableWebSocketChannelClientWrapper>* timer) 164 { 165 ASSERT_UNUSED(timer, timer == &m_resumeTimer); 166 processPendingEvents(); 167 } 168 160 169 WebSocketChannelClient* m_client; 161 170 bool m_syncMethodDone; … … 166 175 Vector<String> m_pendingMessages; 167 176 bool m_pendingClosed; 177 Timer<ThreadableWebSocketChannelClientWrapper> m_resumeTimer; 168 178 }; 169 179 -
trunk/WebCore/websockets/WebSocketChannel.cpp
r59116 r61375 59 59 , m_buffer(0) 60 60 , m_bufferSize(0) 61 , m_resumeTimer(this, &WebSocketChannel::resumeTimerFired) 61 62 , m_suspended(false) 62 63 , m_closed(false) … … 126 127 { 127 128 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); 134 131 } 135 132 … … 235 232 ASSERT(m_client); 236 233 ASSERT(m_buffer); 234 237 235 if (m_handshake.mode() == WebSocketHandshake::Incomplete) { 238 236 int headerLength = m_handshake.readServerHandshake(m_buffer, m_bufferSize); … … 319 317 } 320 318 319 void 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 321 331 } // namespace WebCore 322 332 -
trunk/WebCore/websockets/WebSocketChannel.h
r59116 r61375 83 83 void skipBuffer(int len); 84 84 bool processBuffer(); 85 void resumeTimerFired(Timer<WebSocketChannel>* timer); 85 86 86 87 ScriptExecutionContext* m_context; … … 91 92 int m_bufferSize; 92 93 94 Timer<WebSocketChannel> m_resumeTimer; 93 95 bool m_suspended; 94 96 bool m_closed;
Note: See TracChangeset
for help on using the changeset viewer.