+2011-06-10 Anders Carlsson <andersca@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ REGRESSION (WebKit2): window.showModalDialog() broken
+ https://bugs.webkit.org/show_bug.cgi?id=62496
+ <rdar://problem/9581492>
+
+ If dispatching a message ends up creating a nested run loop, some incoming messages can end up not being
+ delivered until we exit from the run loop.
+
+ Fix this by using a Deque instead of a Vector for incoming messages, and get one message at a time and then
+ dispatch it. That prevents us from having any lingering messages lying around in stack allocated space.
+
+ * Platform/CoreIPC/Connection.cpp:
+ (CoreIPC::Connection::waitForMessage):
+ (CoreIPC::Connection::dispatchMessages):
+ * Platform/CoreIPC/Connection.h:
+
2011-06-10 Sam Weinig <sam@webkit.org>
Reviewed by Anders Carlsson.
{
MutexLocker locker(m_incomingMessagesLock);
- for (size_t i = 0; i < m_incomingMessages.size(); ++i) {
- IncomingMessage& message = m_incomingMessages[i];
+ for (Deque<IncomingMessage>::iterator it = m_incomingMessages.begin(), end = m_incomingMessages.end(); it != end; ++it) {
+ IncomingMessage& message = *it;
if (message.messageID() == messageID && message.arguments()->destinationID() == destinationID) {
OwnPtr<ArgumentDecoder> arguments = message.releaseArguments();
- // Erase the incoming message.
- m_incomingMessages.remove(i);
+ m_incomingMessages.remove(it);
return arguments.release();
}
}
void Connection::dispatchMessages()
{
- Vector<IncomingMessage> incomingMessages;
-
- {
- MutexLocker locker(m_incomingMessagesLock);
- m_incomingMessages.swap(incomingMessages);
- }
+ while (true) {
+ IncomingMessage incomingMessage;
- for (size_t i = 0; i < incomingMessages.size(); ++i)
- dispatchMessage(incomingMessages[i]);
+ {
+ MutexLocker locker(m_incomingMessagesLock);
+ if (m_incomingMessages.isEmpty())
+ break;
+
+ incomingMessage = m_incomingMessages.takeFirst();
+ }
+
+ dispatchMessage(incomingMessage);
+ }
}
} // namespace CoreIPC