2011-06-10 Anders Carlsson <andersca@apple.com>
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 11 Jun 2011 02:04:32 +0000 (02:04 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 11 Jun 2011 02:04:32 +0000 (02:04 +0000)
        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:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@88588 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Platform/CoreIPC/Connection.cpp
Source/WebKit2/Platform/CoreIPC/Connection.h

index 619521a68eb67ba7cb0ffe054a96a157e8352f46..128e4b8132738225269afeec418423f263ce9b08 100644 (file)
@@ -1,3 +1,22 @@
+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.
 2011-06-10  Sam Weinig  <sam@webkit.org>
 
         Reviewed by Anders Carlsson.
index 2bd40235f16f566f08d1eb442c1ce8c00f20030a..01e8b6885fe7d5066343dcdb8062c9502a3c160e 100644 (file)
@@ -326,14 +326,13 @@ PassOwnPtr<ArgumentDecoder> Connection::waitForMessage(MessageID messageID, uint
     {
         MutexLocker locker(m_incomingMessagesLock);
 
     {
         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();
 
 
             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();
             }
         }
                 return arguments.release();
             }
         }
@@ -689,15 +688,19 @@ void Connection::dispatchMessage(IncomingMessage& message)
 
 void Connection::dispatchMessages()
 {
 
 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
 }
 
 } // namespace CoreIPC
index 601c80962030648aea389266f6848e08c2aa4061..5c3ed1dcbff317bb24a7b29bdf6eb0591be90971 100644 (file)
@@ -257,7 +257,7 @@ private:
 
     // Incoming messages.
     Mutex m_incomingMessagesLock;
 
     // Incoming messages.
     Mutex m_incomingMessagesLock;
-    Vector<IncomingMessage> m_incomingMessages;
+    Deque<IncomingMessage> m_incomingMessages;
 
     // Outgoing messages.
     Mutex m_outgoingMessagesLock;
 
     // Outgoing messages.
     Mutex m_outgoingMessagesLock;